小程序如何统一单接口文档
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇"小程序如何统一单接口文档"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"小程序如
千家信息网最后更新 2026年11月04日小程序如何统一单接口文档
这篇"小程序如何统一单接口文档"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"小程序如何统一单接口文档"文章吧。
在做小程序支付希望你已经熟读微信的文档微信支付-小程序-手机端和微信支付-小程序-后台。且你已经有了
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 += '' + 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 += ' '; // 微信小程序统一下单接口 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 和 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安全错误
数据库的锁怎样保障安全
咖啡网
互联网加科技
百单网互联网科技有限公司
科技和互联网公司
互联网科技金融公司
互联网金融公司科技
上海喔噻互联网科技
奔汉互联网科技
天扬科技互联网广告
科技伦理 互联网公司
中国互联网有什么科技含量
哈尔滨屹滨互联网科技有限公司
互联网科技和信息
想开互联网科技公司怎么样
世界互联网领先科技成果获奖
互联网第三次科技革命特征
宇信科技在杭州互联网排第几
互联网科技机房
第三届互联网大会安防黑科技
东风日产互联网科技公司叫什么
深圳科技互联网
亿策互联网科技
成都互联网科技公司
顺玮阁互联网科技
上海万想互联网科技
科技赋能互联网健康
北京华百购互联网科技有限公司
彤创互联网科技有限公司
杭州壁岐互联网科技有限公司
互联网科技手机排行榜