Probleme bei der WeChat-Scancode-Zahlung
Nativer Zahlungs-URL-Parameterfehler
RückrufSchnittstelleDie URL hat einen Rückruf, aber die Parameter können nicht empfangen werden
Händler-Backend Die zurückgegebene Datenfeldstruktur ist illegal
Zeitüberschreitung beim Abrufen der Bestellinformationen des Händlers oder der vom Händler zurückgegebene httpcode ist nicht 200
Problem lösen
Nativer Zahlungs-URL-Parameterfehler
Dieser Fehler tritt im Allgemeinen auf, wenn der QR-Code nach Erhalt der QR-Code-URL auf WeChat generiert und gescannt wird. Wenn Sie auf ein solches Problem stoßen, überprüfen Sie bitte
1, ob Fehler in den Parametern in der Parameterliste vorhanden sind, die zum Generieren des QR-Codes erforderlich sind (Groß-/Kleinschreibung beachten)
2. Signieren Sie die Signatur in den Parametern. Korrigieren Sie den Signaturalgorithmus zu diesem Zeitpunkt. Tool zur Signaturüberprüfung
Das Folgende ist der Code zum Generieren der QR-Code-URL
/** * * @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); }
Callback-Schnittstellen-URL Es gibt einen Callback, aber die Parameter können nicht empfangen werden
Enumeration
while (en.hasMoreElements()) { Object o= en.nextElement(); System.out.println(o.toString()+"="+getPara(o.toString())); }
Die im obigen Code ausgegebenen Parameter sind alle NULL
Da die offizielle Dokumentbeschreibung nicht sehr klar ist, denkt jeder, dass die Parameter wie Produkt-ID und Benutzer-OpenID in der Rückrufanforderung die sind Der von diesem Rückruf zurückgegebene Parameter ist tatsächlich ein XMLEingabestream
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");
Ergebnis ist
< ;return_code> return_code>
Versuchen Sie es mit {
httpsservletRequest 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"); 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(); } }
Das obige ist der detaillierte Inhalt vonWeChat-Scancode-Zahlungsmodus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!