uniapp怎么做微信扫码支付

1. 简介

微信支付是一种在线支付方式,允许用户使用微信支付应用程序支付购买商品或服务。Uniapp 是一种基于 Vue.js 的跨平台开发框架,可以在多个平台使用同一份代码。在 Uniapp 中实现微信支付非常方便,只需要调用微信小程序的接口即可。本文将介绍如何在 Uniapp 中使用微信扫码支付。

2. 准备工作

2.1. 注册微信支付

在使用微信支付之前,需要先注册一个微信支付账号。具体注册过程可以参考微信支付官网。注册完成后,需要在微信支付后台进行相关的配置,包括申请支付权限、设置支付密钥等。在完成微信支付配置后,可以获得以下信息:

appid:用于标识商户身份的 ID,也是进行微信支付的必要参数。

商户号:微信支付分配的商户号。

API 密钥:用于进行数据传输加密的密钥。

支付通知 URL:用于接收微信支付结果通知的 URL,需要在商户平台设置。

注意:需要使用企业证书或个人证书进行微信支付。

2.2. 导入微信支付模块

在 Uniapp 中实现微信支付需要导入微信支付模块。在 uni_modules 中安装 uni-wxpay 模块:

npm install uni-wxpay --save

安装完成后,在需要使用微信支付的页面中导入并初始化模块:

import Wxpay from '@/uni_modules/uni-wxpay/js_sdk/wxpay'

const wxpay = new Wxpay({

appId: 'YOUR_APP_ID',

mchId: 'YOUR_MCH_ID',

apiKey: 'YOUR_API_KEY',

notifyUrl: 'YOUR_NOTIFY_URL'

})

注意:需要将 YOUR_APP_IDYOUR_MCH_IDYOUR_API_KEYYOUR_NOTIFY_URL 替换为实际的值。

3. 实现微信支付

3.1. 准备支付数据

在进行微信支付之前,需要准备支付数据。支付数据包括以下信息:

商户订单号:商户订单号,需要保证唯一性。

商品描述:商品描述。

支付金额:支付金额,单位为分。

交易起始时间:交易起始时间,需要使用 getTime() 获取。

交易结束时间:交易结束时间,需要在起始时间的基础上加上交易过期时间。

用户 IP:用户 IP,可以使用 uni.request() 获取。

具体实现代码如下:

const orderNo = 'ORDER_NO'

const body = 'BODY'

const totalFee = TOTAL_FEE

const timeStart = new Date().getTime()

const timeExpire = timeStart + 30 * 60 * 1000

let clientIp = ''

uni.request({

url: 'https://pv.sohu.com/cityjson?ie=utf-8',

header: {

'Content-Type': 'application/json',

'Accept': 'application/json'

},

success: res => {

const reg = /^.*(?=")/g

clientIp = res.data.match(reg)[0].replace('returnCitySN = ', '')

}

})

注意:需要将 ORDER_NOBODYTOTAL_FEE 替换为实际的值。

3.2. 发起支付请求

支付数据准备完成后,需要通过调用 wxpay.requestPayment(params) 方法发起支付请求。其中,params 为一个对象,包含以下参数:

timeStamp:时间戳,需要使用 getTime() 获取,单位为秒。

nonceStr:随机字符串,可以使用 Math.random() 生成。

package:包含签名的支付信息,需要调用 wxpay.getPayRequestParams() 方法生成。

signType:签名算法,固定为 MD5

paySign:签名,需要调用 wxpay.getPaySign(params) 方法生成。

具体实现代码如下:

wxpay.requestPayment({

timeStamp: parseInt(new Date().getTime() / 1000),

nonceStr: Math.random().toString(36).substr(2),

package: wxpay.getPayRequestParams({

body,

out_trade_no: orderNo,

total_fee: totalFee,

trade_type: 'NATIVE',

spbill_create_ip: clientIp,

time_start: timeStart,

time_expire: timeExpire,

notify_url: wxpay.options.notifyUrl

}),

signType: 'MD5',

paySign: wxpay.getPaySign({

timeStamp: parseInt(new Date().getTime() / 1000),

nonceStr: Math.random().toString(36).substr(2),

package: wxpay.getPayRequestParams({

body,

out_trade_no: orderNo,

total_fee: totalFee,

trade_type: 'NATIVE',

spbill_create_ip: clientIp,

time_start: timeStart,

time_expire: timeExpire,

notify_url: wxpay.options.notifyUrl

}),

signType: 'MD5'

})

}).then(res => {

console.log(res)

}).catch(err => {

console.error(err)

})

4. 支付结果通知

支付完成后,微信支付会通过支付结果通知将支付结果返回到商户平台。需要在商户平台设置支付通知 URL,在该 URL 接收来自微信支付的支付结果通知。支付结果通知采用 HTTP POST 请求,包含以下参数:

return_code:返回状态码,SUCCESS 表示成功,FAIL 表示失败。

return_msg:返回信息。

appid:公众账号 ID。

mch_id:商户号。

nonce_str:随机字符串。

sign:签名。

result_code:业务结果,SUCCESS 表示成功,FAIL 表示失败。

openid:用户标识。

is_subscribe:是否关注公众账号。

trade_type:交易类型,例如 NATIVE

bank_type:付款银行。

total_fee:订单金额。

settlement_total_fee:应结订单金额。

cash_fee:现金支付金额。

transaction_id:微信支付订单号。

out_trade_no:商户订单号。

attach:商家数据包。

time_end:支付完成时间。

需要在支付结果通知 URL 中使用以下代码解析支付结果通知:

const express = require('express')

const Wxpay = require('wxpay-sdk')

const router = express.Router()

const wxpay = new Wxpay({

app_id: 'YOUR_APP_ID',

mch_id: 'YOUR_MCH_ID',

key: 'YOUR_API_KEY'

})

router.post('/notify_url', (req, res) => {

const data = req.body

if (wxpay.verifySign(data)) {

// 对支付结果进行相应的处理

res.send(wxpay.buildResponse({

return_code: 'SUCCESS',

return_msg: 'OK'

}))

} else {

res.send(wxpay.buildResponse({

return_code: 'FAIL',

return_msg: 'Sign Error'

}))

}

})

module.exports = router

需要将 YOUR_APP_IDYOUR_MCH_IDYOUR_API_KEY 替换为实际的值。

5. 总结

本文介绍了如何在 Uniapp 中使用微信扫码支付。需要先完成微信支付的注册和配置,然后导入微信支付模块,准备支付数据并发起支付请求,最后在支付结果通知 URL 中解析支付结果通知。通过本文的介绍,相信读者已经对 Uniapp 实现微信支付有了一定的了解。