微信小程序> 微信小程序开发五小程序支付-统一下单-怎么制作下单的小程序-商城小程序制作

微信小程序开发五小程序支付-统一下单-怎么制作下单的小程序-商城小程序制作

浏览量:3098 时间: 来源:湖工电气
1.

准确来说小程序的支付在上个月就已经做完了,只是那个时候项目原型和UI还没出来就没正式动工。现在项目快做完了,就有时间写博客了。在做小程序支付希望你已经熟读微信的文档微信支付-小程序-手机端和微信支付-小程序-后台。且你已经有了

AppID:"wx****************",//小程序IDSecret:"********************************",//小程序SecretMch_id:"**********",//商户号Mch_key:"********************",//商户key2.

关于上面的这4个数据的获取,请自行在自己的账号中获取和设置。且你已经有了用户的openid。《微信小程序开发(四)获取用户openid》。

小程序接口wx.requestPayment({'timeStamp':'','nonceStr':'','package':'','signType':'MD5','paySign':'','success':function(res){},'fail':function(res){}})3.

小程序接口就暴露这一个方法。这个方法有4个参数是需要后台去获取的。其实大部分工作都是后台的事情。

后端实现4.

后端主要是统一下单的这个接口https://api.mch.weixin.qq.com/pay/unifiedorder。这里主要就是几个签名算法:

统一下单签名//生成签名functionpaysignjsapi(appid,body,mch_id,nonce_str,notify_url,openid,out_trade_no,spbill_create_ip,total_fee){varret{appid:appid,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:'JSAPI'};varstrraw(ret);strstr+'key'+key;varmd5StrcryptoMO.createHash('md5').update(str).digest('hex');md5Strmd5Str.toUpperCase();returnmd5Str;};functionraw(args){varkeysObject.keys(args);keyskeys.sort();varnewArgs{};keys.forEach(function(key){newArgs[key.toLowerCase()]args[key];});varstr'';for(varkinnewArgs){str+''+k+''+newArgs[k];}strstr.substr(1);returnstr;};小程序paySignfunctionpaysignjs(appid,nonceStr,package,signType,timeStamp){varret{appId:appid,nonceStr:nonceStr,package:package,signType:signType,timeStamp:timeStamp};varstrraw1(ret);strstr+'key'+key;returncryptoMO.createHash('md5').update(str).digest('hex');};functionraw1(args){varkeysObject.keys(args);keyskeys.sort()varnewArgs{};keys.forEach(function(key){newArgs[key]args[key];});varstr'';for(varkinnewArgs){str+''+k+''+newArgs[k];}strstr.substr(1);returnstr;};统一下单后端实现varwxConfigrequire('../wx_pay/wx_x_config');varcryptoMOrequire('crypto');//MD5算法varparseStringrequire('xml2js').parseString;//xml转js对象varkeywxConfig.Mch_key;/**根据openid发起微信支付*/router.all('/api/wxpay/unifiedorder',function(req,res,next){varparamreq.query||req.params;varopenidparam.openid;varspbill_create_ipreq.ip.replace(/::ffff:/,'');//获取客户端ipvarbody'测试支付';//商品描述varnotify_url'https://www.hgdqdev.cn/api/wxpay'//支付成功的回调地址可访问不带参数varnonce_strgetNonceStr();//随机字符串varout_trade_nowxConfig.getWxPayOrdrID();//商户订单号vartotal_fee'1';//订单价格单位是分vartimestampMath.round(newDate().getTime()/1000);//当前时间varbodyData'xml';bodyData+'appid'+wxConfig.AppID+'/appid';//小程序IDbodyData+'body'+body+'/body';//商品描述bodyData+'mch_id'+wxConfig.Mch_id+'/mch_id';//商户号bodyData+'nonce_str'+nonce_str+'/nonce_str';//随机字符串bodyData+'notify_url'+notify_url+'/notify_url';//支付成功的回调地址bodyData+'openid'+openid+'/openid';//用户标识bodyData+'out_trade_no'+out_trade_no+'/out_trade_no';//商户订单号bodyData+'spbill_create_ip'+spbill_create_ip+'/spbill_create_ip';//终端IPbodyData+'total_fee'+total_fee+'/total_fee';//总金额单位为分bodyData+'trade_typeJSAPI/trade_type';//交易类型小程序取值如下:JSAPI//签名varsignpaysignjsapi(wxConfig.AppID,body,wxConfig.Mch_id,nonce_str,notify_url,openid,out_trade_no,spbill_create_ip,total_fee);bodyData+'sign'+sign+'/sign';bodyData+'/xml';//微信小程序统一下单接口varurlStr'https://api.mch.weixin.qq.com/pay/unifiedorder';request({url:urlStr,method:'POST',body:bodyData},function(error,response,body){if(!errorresponse.statusCode200){varreturnValue{};parseString(body,function(err,result){if(result.xml.return_code[0]'SUCCESS'){returnValue.msg'操作成功';returnValue.status'100';returnValue.out_trade_noout_trade_no;//商户订单号//小程序客户端支付需要nonceStr,timestamp,package,paySign这四个参数returnValue.nonceStrresult.xml.nonce_str[0];//随机字符串returnValue.timestamptimestamp.toString();//时间戳returnValue.package'prepay_id'+result.xml.prepay_id[0];//统一下单接口返回的prepay_id参数值returnValue.paySignpaysignjs(wxConfig.AppID,returnValue.nonceStr,returnValue.package,'MD5',timestamp);//签名res.end(JSON.stringify(returnValue));}else{returnValue.msgresult.xml.return_msg[0];returnValue.status'102';res.end(JSON.stringify(returnValue));}});}})});5.

wxConfig代码:

/*微信参数AppID和Secret*/varwxConfig{AppID:"wx****************",//小程序IDSecret:"********************************",//小程序SecretMch_id:"**********",//商户号Mch_key:"********************",//商户key//生成商户订单号getWxPayOrdrID:function(){varmyDatenewDate();varyearmyDate.getFullYear();varmouthmyDate.getMonth()+1;vardaymyDate.getDate();varhourmyDate.getHours();varminutemyDate.getMinutes();varsecondmyDate.getSeconds();varmsecondmyDate.getMilliseconds();//获取当前毫秒数(0-999)if(mouth10){/*月份小于10就在前面加个0*/mouthString(String(0)+String(mouth));}if(day10){/*日期小于10就在前面加个0*/dayString(String(0)+String(day));}if(hour10){/*时小于10就在前面加个0*/hourString(String(0)+String(hour));}if(minute10){/*分小于10就在前面加个0*/minuteString(String(0)+String(minute));}if(second10){/*秒小于10就在前面加个0*/secondString(String(0)+String(second));}if(msecond10){msecondString(String(00)+String(second));}elseif(msecond10msecond100){msecondString(String(0)+String(second));}varcurrentDateString(year)+String(mouth)+String(day)+String(hour)+String(minute)+String(second)+String(msecond);returncurrentDate;}};module.exportswxConfig;实例//支付按钮点击事件payTap:function(){varselfthis;wx.request({url:'https://www.hgdqdev.cn/api/wxpay/unifiedorder',data:{openid:self.data.openid//这里正常项目不会只有openid一个参数},success:function(res){if(res.data.status100){varpayModelres.data;wx.requestPayment({'timeStamp':payModel.timestamp,'nonceStr':payModel.nonceStr,'package':payModel.package,'signType':'MD5','paySign':payModel.paySign,'success':function(res){wx.showToast({title:'支付成功',icon:'success',duration:2000})},'fail':function(res){}})}},fail:function(){}})},

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎