nodejs 위 챗 결제 V3 (2) 공중 번호 지불 실현

5345 단어
공중전화 결제 통합 인터페이스 에 있 는 openid 가 필요 합 니 다. tradetype 을 JSPI 로 설정
exports.jsapipay = function (req, res) {
    var bookingNo = req.query.bookingNo;
    var appid = _appid;
    var attach = _attach;
    var mch_id = _mch_id;
    var nonce_str = _nonce_str;
    var total_fee = _total_fee;
    var notify_url = _notify_url;
    var openid = _openid;
    var body = _body;
    var timeStamp = _timeStamp; 
    var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    var formData  = "";
    formData  += ""+appid+"";  //appid
    formData  += ""+attach+""; //    
    formData  += ""+body+"";
    formData  += ""+mch_id+"";  //   
    formData  += ""+nonce_str+""; //     ,   32 。
    formData  += ""+notify_url+"";
    formData  += ""+openid+"";
    formData  += ""+bookingNo+"";
    formData  += "";
    formData  += ""+total_fee+"";
    formData  += "JSAPI";
    formData  += ""+paysignjsapi(appid,attach,body,mch_id,nonce_str,notify_url,openid,bookingNo,'',total_fee,'JSAPI')+"";
    formData  += "";
    request({url:url,method:'POST',body: formData},function(err,response,body){
        if(!err && response.statusCode == 200){
            console.log(body);
            var prepay_id = getXMLNodeValue('prepay_id',body.toString("utf-8"));
            var tmp = prepay_id.split('[');
            var tmp1 = tmp[2].split(']');
            //  
            var _paySignjs = paysignjs(appid,nonce_str,'prepay_id='+tmp1[0],'MD5',timeStamp);
            res.render('jsapipay',{prepay_id:tmp1[0],_paySignjs:_paySignjs});
            //res.render('jsapipay',{rows:body});
            //res.redirect(tmp3[0]);
        }
    });
}

서명 암호 화 알고리즘
function paysignjsapi(appid,attach,body,mch_id,nonce_str,notify_url,openid,out_trade_no,spbill_create_ip,total_fee,trade_type) {
    var ret = {
        appid: appid,
        attach: attach,
        body: body,
        mch_id: mch_id,
        nonce_str: nonce_str,
        notify_url:notify_url,
        openid:openid,
        out_trade_no:out_trade_no,
        spbill_create_ip:spbill_create_ip,
        total_fee:total_fee,
        trade_type:trade_type
    };
    var string = raw(ret);
    var key = _key;
    string = string + '&key='+key;
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string,'utf8').digest('hex');
};

서명 알고리즘 은 대소 문자 에 주의해 야 하 며, 안에 많은 구덩이 가 있다.
function paysignjs(appid,nonceStr,package,signType,timeStamp) {
    var ret = {
        appId: appid,
        nonceStr: nonceStr,
        package:package,
        signType:signType,
        timeStamp:timeStamp
    };
    var string = raw1(ret);
    var key = _key;
    string = string + '&key='+key;
    console.log(string);
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string,'utf8').digest('hex');
};

서명 할 때의 인 자 는 소문 자로 변환 할 필요 가 없습니다.
function raw1(args) {
  var keys = Object.keys(args);
  keys = keys.sort()
  var newArgs = {};
  keys.forEach(function (key) {
    newArgs[key] = args[key];
  });
  var string = '';
  for (var k in newArgs) {
    string += '&' + k + '=' + newArgs[k];
  }
  string = string.substr(1);
  return string;
};

분석 XML
function getXMLNodeValue(node_name,xml){
    var tmp = xml.split("");
    var _tmp = tmp[1].split(""+node_name+">");
    return _tmp[0];
}

클 라 이언 트 는 WeixinJSBridge 를 통 해 팝 업 결제 창 을 직접 실현 합 니 다.
 function jsApiCall()
 {
     WeixinJSBridge.invoke(
         'getBrandWCPayRequest',
     {
         "appId" : "wxebs20ae8d978330b", //     ,     
         "timeStamp" : "1414211784", //   , 1970      
         "nonceStr" : "ibuaiVcKdpRxkhJA", //   
         "package" : "prepay_id=",
         "signType" : "MD5", //      :
         "paySign" : "" //    
     },
         function (res)
     {
         WeixinJSBridge.log(res.err_msg);
         //alert(res.err_code+res.err_desc+res.err_msg);
         //                  
     }
     );
 }
 
 function callpay()
 {
     if (typeof WeixinJSBridge == "undefined")
     {
         if (document.addEventListener)
         {
             document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
         }
         else if (document.attachEvent)
         {
             document.attachEvent('WeixinJSBridgeReady', jsApiCall);
             document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
         }
     }
     else
     {
         jsApiCall();
     }
 }

좋은 웹페이지 즐겨찾기