小程序开发接入微信支付功能的方法介绍

小程序开发接入微信支付功能的方法介绍

1. 准备工作

1.1 获取商户号和appid

要使用微信支付,首先需要拥有一对商户号和appid。商户号可在微信支付商户平台中申请,具体申请流程不在本文的讨论范围内。

1.2 配置支付证书

微信支付需要配置支付证书,以保证支付的安全性。证书可以在微信支付商户平台中下载,需要包括以下三个部分:

- apiclient_cert.pem,客户端证书;

- apiclient_key.pem,客户端证书的私钥;

- rootca.pem,微信支付根证书。

将这三个证书文件下载下来,放到一个文件夹中,作为后续开发的准备。

2. 开发设置

2.1 添加支付能力

在微信开发者工具中,找到 app.json 文件,添加以下内容:

```

{

"plugins": {

"wxpayPlugin": {

"version": "版本号",

"provider": "提供者 URL"

}

}

}

```

其中,版本号和提供者 URL 相应填写。

2.2 引入 wx.requestPayment 接口

使用微信支付,需要调用 wx.requestPayment 接口。在页面中引入该接口:

```

//index.js

import wxpay from 'wxpayPlugin'

Page({

data: {

orderId: '',

paySign: '',

nonceStr: '',

timeStamp: ''

},

pay: function() {

wx.requestPayment({

timeStamp: this.data.timeStamp,

nonceStr: this.data.nonceStr,

package: 'prepay_id=' + this.data.orderId,

signType: 'MD5',

paySign: this.data.paySign,

success: function(res) {

console.log(res)

},

fail: function(res) {

console.log(res)

}

})

}

})

```

3. 后台设置

3.1 获取统一下单接口数据

在后台服务器中,需要调用微信支付的统一下单接口,获取一些支付必要的数据。调用方法如下:

```

const getPaymentData = async (ctx, body, openid, total_fee) => {

//生成随机数

const nonce_str = String(Math.random()).slice(2, 15);

// 获取ip

const ip = ctx.request.ip.replace(/(^\d+\.\d+\.\d+\.\d+).*/, '$1');

// 获取时间戳

const timeStamp = String(Date.now()).slice(0, 10);

const appid = 'YOUR_APPID'; // 小程序 appid

const mch_id = 'YOUR_MCH_ID'; // 商户号

const params = {

appid,

body,

mch_id,

nonce_str,

notify_url: 'https://www.example.com/wechat/pay/notify', // 回调地址,需自行配置

openid,

out_trade_no: nonce_str + String(Date.now()).slice(0, -4),

spbill_create_ip: ip,

total_fee: total_fee * 100,

trade_type: 'JSAPI'

};

const paramsKeys = Object.keys(params).sort();

let string = '';

for (let i = 0, len = paramsKeys.length; i < len; i++) {

string += (paramsKeys[i] + '=' + params[paramsKeys[i]] + '&')

}

string += 'key=YOUR_KEY'; // 商户平台支付 API 密钥,需自行申请

params.sign = md5(string).toUpperCase(); // 生成签名

let res;

try {

res = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder', buildXML(params), { httpsAgent });

} catch (e) {

throw e;

}

const result = await parseXML(res.data);

if (result.return_code === 'SUCCESS' && result.result_code === 'SUCCESS') {

const prepay_id = result.prepay_id;

const nonceStr = String(Math.random()).slice(2, 15);

const packageStr = `prepay_id=${prepay_id}`;

const paySign = getPaySign(nonceStr, packageStr, timeStamp);

return {

timeStamp,

nonceStr,

package: packageStr,

paySign

}

}

console.log(result);

}

```

该接口会返回一个包括 timeStamp、nonceStr、prepay_id 和 paySign 的对象,这些数据后续会在前端页面中用到。

4. 前端设置

4.1 调用后端接口获取支付数据

在前端中,需要调用后台的接口,获取支付数据。可以在页面中让用户点击支付按钮,触发调用后端接口的操作,代码如下:

```

//index.js

Page({

data: {

openid: '',

totalFee: ''

},

async pay() {

const res = await wx.cloud.callFunction({

name: 'login'

})

const openid = JSON.parse(res.result).openid

const { timeStamp, nonceStr, package, paySign } = await wx.cloud.callFunction({

name: 'getPayment',

data: {

openid,

totalFee: this.data.totalFee

}

}).then(res => res.result)

this.setData({

openid,

timeStamp,

nonceStr,

package,

paySign

})

}

})

```

其中,login 是获取用户 openid 的云函数。

4.2 调用微信支付接口

通过前面的步骤,我们已经获得了微信支付所需的数据,接下来就可以调用微信支付接口,发起支付操作了。代码如下:

```

//index.js

Page({

data: {

openid: '',

totalFee: ''

},

async pay() {

// 省略调用后端接口获取支付数据的代码

wx.requestPayment({

timeStamp: this.data.timeStamp,

nonceStr: this.data.nonceStr,

package: this.data.package,

signType: 'MD5',

paySign: this.data.paySign,

success: function(res) {

console.log(res)

},

fail: function(res) {

console.log(res)

}

})

}

})

```

总结

如上所述,接入微信支付功能需要完成如下几个步骤:

1. 获取商户号和 appid;

2. 配置支付证书;

3. 添加支付能力;

4. 引入 wx.requestPayment 接口;

5. 调用微信支付接口。

需要注意的是,微信支付涉及到商户私钥、支付 API 密钥等安全敏感信息,开发过程中需要注意信息的保密性和安全性。