微信支付–node
项目的结构是这样的
Django – 后端
Node – 中间层
Vue – 前端
一、h5支付
整个流程这样的:
前端vue
向后端django
请求一个订单号,再到node
层向微信发起统一订单和接受微信支付结果的异步通知,最后从将交易结果返回给django
层,将交易记录写入数据库。
- 准备阶段 按照文档的要求
申请入口:登录商户平台-->产品中心-->我的产品-->支付产品-->H5支付
取得APPID
,微信支付商户号
,API密钥
,Appsecret
四个字段。 - 引进node版的SDK
node-tenpay
,传送门 - 新建
wechat-pay.js
文件
注意:后台的路由是有带有
api
的
例如:www.domain.com/api/order
请求到后台的api
www.domain.com/unifiedOrder
请求到node
的app.js
文件
h5支付的流程:
- 向后台请求订单号
- 请求统一下单(在node层向微信发起请求)
- 微信返回同步结果(mweb_url)
- 跳转到微信app
- 用户输入密码支付
- 在node层接受微信返回的异步通知,并把结果发到后台计入数据库
- 回到vue向后台轮询支付结果,交易成功则弹出提示信息‘支付成功’
wechat-pay.js
const tenpay = require('tenpay')
const axios = require('axios')
const wechatConfig = {
appid: 'xxxx',
mchid: 'xxxx',
partnerKey: 'xxxx',
notify_url: `www.domain.com/notify`, //微信异步通知的地址
}
const wechatApi = new tenpay(wechatConfig)
async function unifiedOrder(ctx) {
//传过来的total_fee单位为:元,传给微信要转化为分
const {
out_trade_no, total_fee} = ctx.request.body
let sceneInfoObj = {
h5_info: {
type:"Wap",
wap_url: 'xxxx',
wap_name: "赞赏"
}
}
function get_ip () {
//获取用户的真实ip
let ip = ctx.request.get("X-Real-IP") || ctx.request.get("X-Forwarded-For") || ctx.request.ip
if (ip.split(',').length > 0) {
ip = ip.split(',')[0]
}
return ip
}
let fee = total_fee
let result = await wechatApi.unifiedOrder({
out_trade_no: out_trade_no, //商户内部订单号
body: 'xxxxxxxxxxxxxxxxxxxxx',
total_fee: fee*100, //订单金额(单位:分)
trade_type: 'MWEB',
spbill_create_ip: get_ip(), //ip地址
scene_info: JSON.stringify(sceneInfoObj) //场景信息
}<