小程序如何统一单接口文档
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇"小程序如何统一单接口文档"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"小程序如
千家信息网最后更新 2025年02月02日小程序如何统一单接口文档
这篇"小程序如何统一单接口文档"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"小程序如何统一单接口文档"文章吧。
在做小程序支付希望你已经熟读微信的文档微信支付-小程序-手机端和微信支付-小程序-后台。且你已经有了
AppID: "wx****************", // 小程序ID Secret: "********************************", // 小程序Secret Mch_id: "**********", // 商户号 Mch_key: "********************", // 商户key
关于上面的这4个数据的获取,请自行在自己的账号中获取和设置。且你已经有了用户的openid。《微信小程序开发(四)获取用户openid》。
小程序接口
wx.requestPayment({ 'timeStamp': '', 'nonceStr': '', 'package': '', 'signType': 'MD5', 'paySign': '', 'success':function(res){ }, 'fail':function(res){ }})
小程序接口就暴露这一个方法。这个方法有4个参数是需要后台去获取的。
其实大部分工作都是后台的事情。
后端实现
后端主要是统一下单的这个接口https://api.mch.weixin.qq.com/pay/unifiedorder。
这里主要就是几个签名算法:
统一下单签名
// 生成签名function paysignjsapi(appid,body,mch_id,nonce_str,notify_url,openid,out_trade_no,spbill_create_ip,total_fee) { var ret = { 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' }; var str = raw(ret); str = str + '&key='+key; var md5Str = cryptoMO.createHash('md5').update(str).digest('hex'); md5Str = md5Str.toUpperCase(); return md5Str;};function raw(args) { var keys = Object.keys(args); keys = keys.sort(); var newArgs = {}; keys.forEach(function(key) { newArgs[key.toLowerCase()] = args[key]; }); var str = ''; for(var k in newArgs) { str += '&' + k + '=' + newArgs[k]; } str = str.substr(1); return str;};
小程序paySign
function paysignjs(appid, nonceStr, package, signType, timeStamp) { var ret = { appId: appid, nonceStr: nonceStr, package: package, signType: signType, timeStamp: timeStamp }; var str = raw1(ret); str = str + '&key='+key; return cryptoMO.createHash('md5').update(str).digest('hex');};function raw1(args) { var keys = Object.keys(args); keys = keys.sort() var newArgs = {}; keys.forEach(function(key) { newArgs[key] = args[key]; }); var str = ''; for(var k in newArgs) { str += '&' + k + '=' + newArgs[k]; } str = str.substr(1); return str;};
统一下单后端实现
var wxConfig = require('../wx_pay/wx_x_config'); var cryptoMO = require('crypto'); // MD5算法var parseString = require('xml2js').parseString; // xml转js对象var key = wxConfig.Mch_key;/* * 根据openid 发起微信支付 */router.all('/api/wxpay/unifiedorder', function(req, res, next) { var param = req.query || req.params; var openid = param.openid; var spbill_create_ip = req.ip.replace(/::ffff:/, ''); // 获取客户端ip var body = '测试支付'; // 商品描述 var notify_url = 'https://www.hgdqdev.cn/api/wxpay' // 支付成功的回调地址 可访问 不带参数 var nonce_str = getNonceStr(); // 随机字符串 var out_trade_no = wxConfig.getWxPayOrdrID(); // 商户订单号 var total_fee = '1'; // 订单价格 单位是 分 var timestamp = Math.round(new Date().getTime()/1000); // 当前时间 var bodyData = ''; bodyData += ' '; // 微信小程序统一下单接口 var urlStr = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; request({ url: urlStr, method: 'POST', body: bodyData }, function (error, response, body) { if (!error && response.statusCode == 200) { var returnValue = {}; parseString(body, function (err, result) { if (result.xml.return_code[0] == 'SUCCESS') { returnValue.msg = '操作成功'; returnValue.status = '100'; returnValue.out_trade_no = out_trade_no; // 商户订单号 // 小程序 客户端支付需要 nonceStr,timestamp,package,paySign 这四个参数 returnValue.nonceStr = result.xml.nonce_str[0]; // 随机字符串 returnValue.timestamp = timestamp.toString(); // 时间戳 returnValue.package = 'prepay_id=' + result.xml.prepay_id[0]; // 统一下单接口返回的 prepay_id 参数值 returnValue.paySign = paysignjs(wxConfig.AppID, returnValue.nonceStr, returnValue.package, 'MD5',timestamp); // 签名 res.end(JSON.stringify(returnValue)); } else{ returnValue.msg = result.xml.return_msg[0]; returnValue.status = '102'; res.end(JSON.stringify(returnValue)); } }); } })});' + wxConfig.AppID + ' '; // 小程序ID bodyData += '' + body + ''; // 商品描述 bodyData += '' + wxConfig.Mch_id + ' '; // 商户号 bodyData += '' + nonce_str + ' '; // 随机字符串 bodyData += '' + notify_url + ' '; // 支付成功的回调地址 bodyData += '' + openid + ' '; // 用户标识 bodyData += '' + out_trade_no + ' '; // 商户订单号 bodyData += '' + spbill_create_ip + ' '; // 终端IP bodyData += '' + total_fee + ' '; // 总金额 单位为分 bodyData += 'JSAPI '; // 交易类型 小程序取值如下:JSAPI // 签名 var sign = paysignjsapi( wxConfig.AppID, body, wxConfig.Mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee ); bodyData += '' + sign + ' '; bodyData += '
wxConfig代码:
/* 微信参数AppID 和 Secret */var wxConfig = { AppID: "wx****************", // 小程序ID Secret: "********************************", // 小程序Secret Mch_id: "**********", // 商户号 Mch_key: "********************", // 商户key // 生成商户订单号 getWxPayOrdrID: function(){ var myDate = new Date(); var year = myDate.getFullYear(); var mouth = myDate.getMonth() + 1; var day = myDate.getDate(); var hour = myDate.getHours(); var minute = myDate.getMinutes(); var second = myDate.getSeconds(); var msecond = myDate.getMilliseconds(); //获取当前毫秒数(0-999) if(mouth < 10){ /*月份小于10 就在前面加个0*/ mouth = String(String(0) + String(mouth)); } if(day < 10){ /*日期小于10 就在前面加个0*/ day = String(String(0) + String(day)); } if(hour < 10){ /*时小于10 就在前面加个0*/ hour = String(String(0) + String(hour)); } if(minute < 10){ /*分小于10 就在前面加个0*/ minute = String(String(0) + String(minute)); } if(second < 10){ /*秒小于10 就在前面加个0*/ second = String(String(0) + String(second)); } if (msecond < 10) { msecond = String(String(00) + String(second)); } else if(msecond >= 10 && msecond < 100){ msecond = String(String(0) + String(second)); } var currentDate = String(year) + String(mouth) + String(day) + String(hour) + String(minute) + String(second) + String(msecond); return currentDate; }};module.exports = wxConfig;
实例
// 支付按钮点击事件 payTap: function(){ var self = this; wx.request({ url: 'https://www.hgdqdev.cn/api/wxpay/unifiedorder', data: { openid: self.data.openid // 这里正常项目不会只有openid一个参数 }, success: function(res){ if(res.data.status == 100){ var payModel = res.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(){ } }) },
以上就是关于"小程序如何统一单接口文档"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
程序
支付
商户
接口
统一
参数
内容
订单
文档
成功
订单号
后台
字符
字符串
用户
单位
商品
地址
大部分
客户
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
管家婆数据库文件丢失
客户咨询软件开发
mysql搭建企业数据库
自考本计算机网络技术科目
移动游戏进不去电信服务器
内蒙古公路网络安全
边缘服务器芯片
服务器安全组端口有多少
小常识网络安全篇
itunes联系不上更新服务器
软件开发是做app开发吗
网络安全渗透测试视频教程
dz登录数据库
四川宫司令app软件开发
数据库全库
家庭nas数据也要经过服务器吧
宁波tcl通信软件开发
云服务器可以挂软件吗
澳洲软件开发工资
小学网络安全领导小组职责
从服务器下载源码
杭州盛立金融软件开发岗怎么样
数据库的并行转换
为什么小米枪战服务器不连接
济南公交数据库
数据库原理 视频教程下载
数据库改密码 md5
手机影视网络技术
手游版罗布乐思怎么建服务器
简睿捷软件开发公司