Maison >Applet WeChat >Développement WeChat >Mode de paiement par code scan WeChat
Problèmes rencontrés lors du paiement par code scan WeChat
Erreur du paramètre de l'URL de paiement natif
CallbackInterfaceL'URL a un rappel, mais les paramètres ne peuvent pas être reçus
Backend du marchand La structure du champ de données renvoyée est illégale
Délai d'expiration pour obtenir les informations de commande du commerçant ou le code http renvoyé par le commerçant n'est pas 200
Résoudre le problème
Erreur du paramètre d'URL de paiement natif
Cette erreur se produit généralement lorsque le code QR est généré et scanné sur WeChat après avoir obtenu l'URL du code QR. Si vous rencontrez ce type de problème, veuillez vérifier
1. S'il y a des erreurs dans les paramètres de la liste des paramètres requis pour générer le code QR (sensible à la casse)
2. Signez la signature dans les paramètres Corriger l'algorithme de signature au moment Outil de vérification de la signature
Voici le code pour générer l'URL du code QR
/** * * @author Javen * 2016年5月14日 * 扫码支付获取二维码URL(模式一) */ public String getCodeUrl(){ String url="weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXX&time_stamp=XXXXX&nonce_str=XXXXX"; String product_id="001"; String timeStamp=Long.toString(System.currentTimeMillis() / 1000); String nonceStr=Long.toString(System.currentTimeMillis()); Map<String, String> packageParams = new HashMap<String, String>(); packageParams.put("appid", appid); packageParams.put("mch_id", partner); packageParams.put("product_id",product_id); packageParams.put("time_stamp", timeStamp); packageParams.put("nonce_str", nonceStr); String packageSign = PaymentKit.createSign(packageParams, paternerKey); return StringUtils.replace(url, "XXXXX", packageSign,appid,partner,product_id,timeStamp,nonceStr); }
URL de l'interface de rappel Il y a un rappel, mais les paramètres ne peuvent pas être reçus
Enumeration
while (en.hasMoreElements()) { Object o= en.nextElement(); System.out.println(o.toString()+"="+getPara(o.toString())); }
Les paramètres affichés dans le code ci-dessus sont tous NULL
Étant donné que la description officielle du document n'est pas très claire, tout le monde pense que les paramètres tels que productid et openid de l'utilisateur dans la demande de rappel sont les identique aux paramètres ordinaires. En fait, le paramètre renvoyé par ce rappel est un XMLInput stream
HttpServletRequest request = getRequest(); /** * 获取用户扫描二维码后,微信返回的信息 */ InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } outSteam.close(); inStream.close(); String result = new String(outSteam.toByteArray(),"utf-8");
le résultat est
/** Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
<. ;return_code> return_code>
* 获取用户扫描二维码后,微信返回的信息
*/
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
String result = new String(outSteam.toByteArray(),"utf-8");
System.out.println("callback>>>>"+result);
/**
* 获取返回的信息内容中各个参数的值
*/
Map<String, String> map = PaymentKit.xmlToMap(result);
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
String appid=map.get("appid");
String openid = map.get("openid");
String mch_id = map.get("mch_id");
String is_subscribe = map.get("is_subscribe");
String nonce_str = map.get("nonce_str");
String product_id = map.get("product_id");
String sign = map.get("sign");
Map<String, String> packageParams = new HashMap<String, String>();
packageParams.put("appid", appid);
packageParams.put("openid", openid);
packageParams.put("mch_id",mch_id);
packageParams.put("is_subscribe",is_subscribe);
packageParams.put("nonce_str",nonce_str);
packageParams.put("product_id", product_id);
String packageSign = PaymentKit.createSign(packageParams, paternerKey);
// 统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
Map<String, String> params = new HashMap<String, String>();
params.put("appid", appid);
params.put("mch_id", mch_id);
params.put("body", "测试扫码支付");
String out_trade_no=Long.toString(System.currentTimeMillis());
params.put("out_trade_no", out_trade_no);
int price=((int)(Float.valueOf(10)*100));
params.put("total_fee", price+"");
params.put("attach", out_trade_no);
String ip = IpKit.getRealIp(getRequest());
if (StrKit.isBlank(ip)) {
ip = "127.0.0.1";
}
params.put("spbill_create_ip", ip);
params.put("trade_type", TradeType.NATIVE.name());
params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
params.put("notify_url", notify_url);
params.put("openid", openid);
String paysign = PaymentKit.createSign(params, paternerKey);
params.put("sign", paysign);
String xmlResult = PaymentApi.pushOrder(params);
System.out.println("prepay_xml>>>"+xmlResult);
/**
* 发送信息给微信服务器
*/
Map<String, String> payResult = PaymentKit.xmlToMap(xmlResult);
String return_code = payResult.get("return_code");
String result_code = payResult.get("result_code");
if (StrKit.notBlank(return_code) && StrKit.notBlank(result_code) && return_code.equalsIgnoreCase("SUCCESS")&&result_code.equalsIgnoreCase("SUCCESS")) {
// 以下字段在return_code 和result_code都为SUCCESS的时候有返回
String prepay_id = payResult.get("prepay_id");
Map<String, String> prepayParams = new HashMap<String, String>();
prepayParams.put("return_code", "SUCCESS");
prepayParams.put("appId", appid);
prepayParams.put("mch_id", mch_id);
prepayParams.put("nonceStr", System.currentTimeMillis() + "");
prepayParams.put("prepay_id", prepay_id);
String prepaySign = null;
if (sign.equals(packageSign)) {
prepayParams.put("result_code", "SUCCESS");
}else {
prepayParams.put("result_code", "FAIL");
prepayParams.put("err_code_des", "订单失效"); //result_code为FAIL时,添加该键值对,value值是微信告诉客户的信息
}
prepaySign = PaymentKit.createSign(prepayParams, paternerKey);
prepayParams.put("sign", prepaySign);
String xml = PaymentKit.toXml(prepayParams);
log.error(xml);
renderText(xml);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}