太原小程序开发_基于nodejs完成微信支付功用

日期:2021-01-11 类型:科技新闻 

关键词:如何制作微信小游戏,微信游戏小程序,公众号游戏,h5小游戏模板,小程序游戏源码

基于nodejs实现微信支付功能       这篇文章主要为大家详细介绍了基于nodejs实现微信支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

通过nodejs使用微信支付最重要的就是微信的签名,在这里md5后的字符必须转化为大写

一、回复微信通知消息模版

message.ejs

 xml 
 return_code ![CDATA[ %-return_code% ]] /return_code 
 return_msg ![CDATA[ %=return_msg% ]] /return_msg 
 /xml 

二、微信支付model文件代码

wxpay.js

var config = require('../config'); //配置文件 appid 等信息 
var Q = require("q"); 
var request = require("request"); 
var crypto = require('crypto'); 
var ejs = require('ejs'); 
var fs = require('fs'); 
var key = "此处为申请微信支付的API密码"; 
var messageTpl = fs.readFileSync(__dirname + '/message.ejs', 'utf-8'); 
var WxPay = { 
 getXMLNodeValue: function(node_name, xml) { 
 var tmp = xml.split(" " + node_name + " 
 var _tmp = tmp[1].split(" /" + node_name + " 
 return _tmp[0]; 
 raw: function(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; 
 paysignjs: function(appid, nonceStr, package, signType, timeStamp) { 
 var ret = { 
 appId: appid, 
 nonceStr: nonceStr, 
 package: package, 
 signType: signType, 
 timeStamp: timeStamp 
 var string = this.raw(ret); 
 string = string + ' key=' + key; 
 var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex'); 
 return sign.toUpperCase(); 
 paysignjsapi: function(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 = this.raw(ret); 
 string = string + ' key=' + key; //key为在微信商户平台(pay.)-- 账户设置-- API安全-- 密钥设置 
 var crypto = require('crypto'); 
 var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex'); 
 return sign.toUpperCase(); 
 // 随机字符串产生函数 
 createNonceStr: function() { 
 return Math.random().toString(36).substr(2, 15); 
 // 时间戳产生函数 
 createTimeStamp: function() { 
 return parseInt(new Date().getTime() / 1000) + ''; 
 }, 

// 此处的attach不能为空值 否则微信提示签名错误 order: function(attach, body, mch_id, openid, bookingNo, total_fee, notify_url) { var deferred = Q.defer(); var appid = config.member_config.appid; var nonce_str = this.createNonceStr(); var timeStamp = this.createTimeStamp(); var url = "pay/unifiedorder"; var formData = " xml formData += " appid " + appid + " /appid //appid formData += " attach " + attach + " /attach //附加数据 formData += " body " + body + " /body formData += " mch_id " + mch_id + " /mch_id //商户号 formData += " nonce_str " + nonce_str + " /nonce_str //随机字符串,不长于32位。 formData += " notify_url " + notify_url + " /notify_url formData += " openid " + openid + " /openid formData += " out_trade_no " + bookingNo + " /out_trade_no formData += " spbill_create_ip 61.50.221.43 /spbill_create_ip formData += " total_fee " + total_fee + " /total_fee formData += " trade_type JSAPI /trade_type formData += " sign " + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, '61.50.221.43', total_fee, 'JSAPI') + " /sign formData += " /xml var self = this; request({ url: url, method: 'POST', body: formData }, function(err, response, body) { if (!err response.statusCode == 200) { console.log(body); var prepay_id = self.getXMLNodeValue('prepay_id', body.toString("utf-8")); var tmp = prepay_id.split('['); var tmp1 = tmp[2].split(']'); //签名 var _paySignjs = self.paysignjs(appid, nonce_str, 'prepay_id=' + tmp1[0], 'MD5', timeStamp); var args = { appId: appid, timeStamp: timeStamp, nonceStr: nonce_str, signType: "MD5", package: tmp1[0], paySign: _paySignjs deferred.resolve(args); } else { console.log(body); }); return deferred.promise; //支付回调通知 notify: function(obj) { var output = ""; if (obj.return_code == "SUCCESS") { var reply = { return_code: "SUCCESS", return_msg: "OK" } else { var reply = { return_code: "FAIL", return_msg: "FAIL" output = ejs.render(messageTpl, reply); return output; module.exports = WxPay;

三、在express router中调用wxpay

//微信支付demo 
router.get('/order', function(req, res, next){ 
 var attach = ""; 
 var body = "测试支付"; 
 var mch_id = "1111111"; //商户ID 
 var openid = "111111"; 
 var bookingNo = "2046"; //订单号 
 var total_fee = 10; 
 var notify_url = "wxpay/notify"; //通知地址 
 wxpay.order(attach, body, mch_id, openid, bookingNo, total_fee, notify_url).then(function(data){ 
 res.render('wxpay', {args: data}); 
 }); 

//微信回调通知 采用数据流形式读取微信返回的xml数据 此处不在累赘 router.post('/notify', function(req, res, next){

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持凡科。