Maison >Applet WeChat >Développement WeChat >Mode de paiement par code scan WeChat

Mode de paiement par code scan WeChat

PHPz
PHPzoriginal
2017-04-04 11:30:116898parcourir

Paiement par code scan WeChat (Mode 1)


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 en=getParaNames();

      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


<. ;return_code>

< ;![CDATA[wx5e9360a3f46f64cd]]>


< ]>&Lt; /trade_type><br><code_url>![CD ATA[weixin:/ /wxpay/bizpayurl?pr=Gj3ZF2b]]</code_url><br></xml><br><br>Si le return_code result_code n'est pas SUCCESS et l'interface de rappel ne renvoie aucune donnée ou les données renvoyées ne le sont pas. Si c'est légal, l'erreur suivante apparaîtra <br></p> <p></p>La structure du champ de données renvoyée par le commerçant le backend est illégal (le format du paquet de données renvoyé est incorrect)<ul class=" list-paddingleft-2"> <li> <p></p>Obtenir le commerçant Les informations de commande expirent ou le code http renvoyé par le commerçant n'est pas 200 (aucun paquet de données renvoyé) </li> <li> <p></p>S'il n'y a pas de problème avec ce qui précède, il reste la dernière étape. Le système backend du commerçant renvoie le prepay_id à WeChat. Voici un code détaillé </li> </ul> <p> Public. void wxpay () {</p> Essayez {<pre class="brush:php;toolbar:false">/**  * @author Javen  * 2016年5月14日  * 扫码支付回调(模式一)  */ 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");

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

}

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn