1.微信登陆认证微信端设置 设置回调页面 url(www.isongli.net)
2.支付微信设置
申请开通微信支付
设置支付授权目录
设置业务域名和 js 调起域名
设置 appkey ( )
代码块: Routes/ wxlogin.js module.exports = { method: 'get', path: '{root}/ wxlogin.html', process: function (req, res) { res.render('wxlogin', { title: '微信支付登录' }) } };
order-info.js var request = require('request');
module.exports = { method: 'get', path: '{root}/ order-info.html', process: function (req, res) {
var code = req.query.code; var ordernum = req.query.ordernum; var amount = req.query.amount; var appID =’’; var secret = ‘’;
var accessTokenUrlOne = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' + appID + '&secret=' + secret + '&code=' + code + '&grant_type=authorization_code';
function getRefreshTokenUrl(refreshToken) { return 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=' + appID + '&grant_type=refresh_token&refresh_token=' + refreshToken; }
function getUserInfoUrl(accessToken, openID) { return 'https://api.weixin.qq.com/sns/userinfo?access_token=' + accessToken + '&openid=' + openID; }
request(accessTokenUrlOne, {timeout: 1000 * 0}, function (error, response, body1)
{ var data1 = JSON.parse(body1); var refreshToken = data1.refresh_token; var accessToken1 = data1.access_token;
request(getRefreshTokenUrl(refreshToken), {timeout: 1000 * 0}, function (error, response, body2) { var data2 = JSON.parse(body2); var accessToken = data2.access_token; var openID = data2.openid;
request(getUserInfoUrl(accessToken, openID), {timeout:1000 * 0}, function (error, response, body3) { var data3 = JSON.parse(body3);
res.render('wxindex', { body1: data1, body2: data2, body3: data3, amount:amount, ordernum:ordernum }) }); });
});
} };
/pay.js var ip = require('ip'); var md5 = require('md5'); var request = require('request'); var xml = require('xml'); var select = require('xpath.js') ,dom = require('xmldom').DOMParser
module.exports = { method: 'get', path: '{root}/wxpay/pay.html', process: function (req, res) {
//户号 var appid =’’; var body = '订单描述';
var mch_id = '1249885301'; //商户号
var nonce_str='abcdABCDEFGHIJKLM123456789'; //随机字符串 var notify_url='http://www.isongli.net/notify'; //返回通知地址 var openid = req.query.openid; var out_trade_no=req.query.ordernum; var spbill_create_ip=ip.address(); var total_fee=req.query.amount; var trade_type ='JSAPI';
var appkey =’’; var stringA = 'appid='+appid+'&body='+body+'&mch_id='+mch_id+'&nonce_str='+nonce_str+'¬ify_url='+n otify_url+'&openid='+openid+'&out_trade_no='+out_trade_no+'&spbill_create_ip='+spbill_creat e_ip+'&total_fee='+total_fee+'&trade_type='+trade_type; var stringSignTemp = stringA+'&key='+appkey; var sign = md5(stringSignTemp); //获取预支付 ID 签名
//获取预支付 ID var prepayXml = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; var xmlStr = [{xml: [{ 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: trade_type }, { sign: sign } ]}]; var allXmlStr = xml(xmlStr);
request.post({url:prepayXml, form: allXmlStr}, function(err,req,body){
var doc = new dom().parseFromString(body); var nodes = select(doc, "//prepay_id"); var timeStamp = new Date().getTime().toString(); var nonceStr = nonce_str; var prepay_id = nodes[0].firstChild.data;
var package = 'prepay_id='+prepay_id; var signType = 'MD5'; var stringB = 'appId=' + appid + '&nonceStr=' + nonceStr + '&package=' + package + '&signType=' + signType+ '&timeStamp=' + timeStamp;
var stringSignTempPay = stringB+'&key='+appkey; var paySign = md5(stringSignTempPay);
console.log('body:'+body); console.log('stringB:'+stringB); console.log('paySign:'+paySign); var sn = md5(out_trade_no+total_fee+'iwean');
res.setHeader("Set-Cookie",["openid="+openid]); res.render('wxpay', { title: '微信支付', orderNum:out_trade_no, amount:total_fee, sn:sn, appId:appid, timeStamp:timeStamp, nonceStr:nonceStr, package:package, signType:signType, paySign:paySign })
})
} };
views/ wxlogin.html <!DOCTYPE html> <html> <head> ….. </head> <body class="dowpagebg">
<div class="dowpage" style="padding:30px;"> <h2>微信登录</h2> <br/> <a href="javascript:;" class="butLogin">微信一键登陆</a> </div>
</body> //JS 库 <script src="zepot.js or jquery.js"></script> <script> var url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7e6f3745dcc331bc&redirect_ uri='+encodeURIComponent('http://www.iwifitech.com/wxindex.html')+'&response_type=code& scope=snsapi_userinfo&state=state#wechat_redirect'; console.log(url); $('.butLogin').click(function () { window.location.href = url; });</script> </html>
order-info.html
<!DOCTYPE html> <html> <head> ….. </head> <body class="dowpagebg"> <div class="dowpage" style="padding:30px;"> <br/> <input type="number" value="" id="amount" placeholder="请输入金额..."/> <br/><br/> <a href="#" class=”wxpay_btn” >微信登陆</a> </div> </body> //JS 库 <script src="zepot.js or jquery.js"></script> <script> $(‘. wxpay’). click(function(){ var amount = $(‘# amount’).val(); var openid = '<%-body3.openid%>'; var ordernum = new Date().getTime(); //订单 Id 后台传过来,临时测试可能
var url = '/wxpay/pay.html?openid='+openid+'&ordernum='+ordernum+'&amount='+amount; window.location.href = url; });
</script> </html>
pay.html
<!DOCTYPE html> <html> <head> ….. </head> <body class="dowpagebg"> <div class="header">微信支付</div> <div class="member_login"> <div class="forminfo" style="font-size:0.8rem; color:#666;"> <br/><br/><br/><br/> <h2 style="font-size:1rem; color:#333;">支付订单信息</h2><br/> 订单号:<%- orderNum %><br/><br/> 支付金额:<%- amount %><br/><br/><br/> <a href="javascript:;" οnclick="wxPay()" class="subbtn">立即支付</a> </div> </div> </body> //JS 库 <script src="zepot.js or jquery.js"></script> <script> function wxPay(){ var sn = '<%-sn%>'; //md5 加密 var amount = '<%-amount%>'; //支付金额 var orderNum = '<%-orderNum%>'; //支付订单号 var backUrl = '支付成功返回地 址?sn='+sn+'&amount='+amount+'&out_trade_no='+orderNum+'&success='; //返回 2 成功, 1 取消,0 支付失败
WeixinJSBridge.invoke('getBrandWCPayRequest',{ 'appId': '<%-appId%>', //公众号名称,由商户传入 'timeStamp': '<%-timeStamp%>', //时间戳,自 1970 年以来的秒数 'nonceStr': '<%-nonceStr%>', //随机串 'package': '<%-package%>', 'signType': '<%-signType%>',//微信签名方式: 'paySign': '<%-paySign%>' //微信签名 }, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") { alert("微信支付成功!"); window.location.href = backUrl+2; } else if (res.err_msg == "get_brand_wcpay_request:cancel") { alert("用户取消支付!"); window.location.href = backUrl+1; } else { alert("支付失败!" + res.err_msg); window.location.href = backUrl+0; } }); }
</script> </html>
附上代码图片