微信H 5ページJSPAPI支払い

4229 ワード

公式ドキュメントアドレスJSPAPIhttps://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
公式文書アドレス統一注文https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
バックグラウンド取得prepay_idパラメータアドレスhttps://api.mch.weixin.qq.com/pay/unifiedorder
要求パラメータ
        String nonce_str= UUID.randomUUID().toString().replace("-", "");//   
        SortedMap packageParams = new TreeMap();
        packageParams.put("appid", APPID);
        packageParams.put("attach", attach);//    
        packageParams.put("body", describe);//    
        packageParams.put("mch_id", MCHID);//   
        packageParams.put("nonce_str", nonce_str);//   
        packageParams.put("notify_url", NOTIFY_URL);//      
        packageParams.put("out_trade_no", out_trade_no);//     
        packageParams.put("spbill_create_ip", spbill_create_ip);//        IP
        packageParams.put("total_fee", money);//     int               
        packageParams.put("trade_type", "JSAPI"); //   JSAPI
        packageParams.put("openid", openid); //JSAPI        openid
        String sign = WxPayUtils.createSign(packageParams,KEY);//  KEY, MD5  (             ,    JS       )

xml接合パラメータはpackageParamsと一致する
        String xml=""+
                ""+APPID+""+
                ""+attach+""+
                ""+
                ""+MCHID+""+
                ""+nonce_str+""+
                ""+sign+""+
                ""+NOTIFY_URL+""+
                ""+out_trade_no+""+
                ""+spbill_create_ip+""+
                ""+money+""+
                "JSAPI"+
                ""+openid+""+
                "";

戻りパラメータがxml形式のデータ
返された該当フィールドgetをJSフロントエンドに返信
        String appid = (String) map.get("appid");
        String prepay_id = (String) map.get("prepay_id");
        String nonce_str = (String) map.get("nonce_str");
        SortedMap mapParam = new TreeMap();
        mapParam.put("appId", appid);
        mapParam.put("timeStamp", String.valueOf(cUtil.getTime()));
        mapParam.put("nonceStr", nonce_str.trim());
        mapParam.put("package", "prepay_id="+prepay_id.trim());
        mapParam.put("signType", "MD5");
        //    ,       (   paySign)MD5  
        mapParam.put("paySign", WxPayUtils.createSign(mapParam,WxJSPay.KEY));

JSエンド例(公式)
function onBridgeReady(){
   WeixinJSBridge.invoke(
      'getBrandWCPayRequest', {
         "appId":"wx2421b1c4370ec43b",     //     ,          
         "timeStamp":"1395712654",         //   , 1970           
         "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //        
         "package":"prepay_id=u802345jgfjsdfgsdg888",     
         "signType":"MD5",         //      :     
         "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //     
      },
      function(res){
      if(res.err_msg == "get_brand_wcpay_request:ok" ){
      //             ,        :
            //res.err_msg           ok,          。
      } 
   }); 
}

支払署名検証不合格1:フロントエンドに返されるnoncesStrフィールドが単一インタフェースから返されるものと一致しているかどうかをチェック2:paySignが二次署名されているかどうかをチェックし、フロントエンドに返信されているかどうかをチェック3:appidがフロントエンドと一致しているかどうかをチェック4:signTypeが一致しているかどうかをチェック5:noncesStr生成規則をチェックし、注意記号(例:-)
注文失敗、タイムアウト1:timeStampが10ビットintかどうかをチェック2:prepay_をチェックidが有効期間内であるか
この取引先は注文書を予約する権限がなくて、取引先の公衆番号のバックグラウンドが関連JSPIを配置するかどうかを検査します
HttpUrlリンクは正当な範囲内で外部ネットワークアクセスを構成しない