Heim > WeChat-Applet > WeChat-Entwicklung > WeChat-Scancode-Zahlungsmodus

WeChat-Scancode-Zahlungsmodus

PHPz
Freigeben: 2017-04-04 11:30:11
Original
6890 Leute haben es durchsucht

WeChat-Scancode-Zahlung (Modus 1)


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);
}
Nach dem Login kopieren
  • 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()));
      }
    Nach dem Login kopieren

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");
Nach dem Login kopieren

Ergebnis ist


< ;return_code>

< ;![CDATA[wx5e9360a3f46f64cd]]>




&lt ! < /trade_type><br><code_url>![CD ATA[weixin:/ /wxpay/bizpayurl?pr=Gj3ZF2b]]</code_url><br></xml><br></p>Wenn die zurückgegeben wird return_code result_code ist nicht ERFOLGREICH und die Rückrufschnittstelle gibt keine Daten zurück oder die zurückgegebenen Daten sind nicht zulässig. Wenn dies zulässig ist, wird der folgende Fehler angezeigt <p></p> <ul class=" list-paddingleft-2"> <li>Die vom Händler zurückgegebene Datenfeldstruktur Backend ist illegal (das zurückgegebene Datenpaketformat ist falsch)<p></p> </li> <li>Holen Sie sich den Händler. Die Bestellinformationen laufen ab oder der vom Händler zurückgegebene httpcode ist nicht 200 (kein zurückgegebenes Datenpaket) <p></p> </li> </ul>Wenn mit dem oben Gesagten kein Problem vorliegt, bleibt der letzte Schritt bestehen. Das Backend-System des Händlers gibt die prepay_id an WeChat zurück. Im Folgenden finden Sie einen detaillierten Code <p> </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">/**  * @author Javen  * 2016年5月14日  * 扫码支付回调(模式一)  */

Nach dem Login kopieren
Öffentlich void wxpay () {

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();
    }

}
Nach dem Login kopieren


Das obige ist der detaillierte Inhalt vonWeChat-Scancode-Zahlungsmodus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage