1. 注册微信支付商户账号
访问微信支付商户平台:前往微信支付商户平台。
注册账户:根据提示注册微信支付商户号,填写相关信息并提交审核。
2. 配置开发环境
登录微信支付商户平台:使用商户号和密码登录微信支付商户平台。
获取商户号和密钥:
在左侧菜单中选择「账户中心」-「账户设置」-「商户信息」,获取商户号。
在左侧菜单中选择「账户中心」-「账户设置」-「API安全」,设置API密钥(32位的随机字符串),并保存。
3. 开通微信支付功能
进入功能配置:
在左侧菜单中选择「产品中心」,选择需要开通的支付产品(如JSAPI支付)。
按照提示进行开通和配置,填写相关信息。
4. 配置支付目录
设置支付授权目录:
在左侧菜单中选择「产品中心」-「开发配置」。
在「支付授权目录」中添加你的Uni-App小程序的支付目录,比如https://yourappdomain.com/pay/。
5. 获取证书
下载API证书:
在左侧菜单中选择「账户中心」-「账户设置」-「API安全」,下载API证书(包括apiclient_cert.pem和apiclient_key.pem)。
6. 在小程序后台绑定微信支付
登录微信公众平台:前往微信公众平台并登录。
绑定微信支付商户号:
在左侧菜单中选择「小程序管理」-「开发」-「开发设置」。
在「微信支付」一栏中,点击「绑定商户号」,输入商户号并进行绑定。
7. 后端服务器配置
7.1 安装依赖
你需要安装一个微信支付的Python SDK,比如wechatpy。
pip install wechatpy
7.2 在后端服务器中,配置微信支付接口。
7.2.1 初始化微信支付
你需要配置微信支付的参数,包括appid、mch_id、api_key、以及证书路径。
from wechatpy import WeChatPay
config = {
"appid": "your_app_id",
"mch_id": "your_mch_id",
"api_key": "your_api_key",
"mch_cert": "/path/to/apiclient_cert.pem",
"mch_key": "/path/to/apiclient_key.pem",
"notify_url": "https://yourappdomain.com/pay/notify",
}
wechatpay = WeChatPay(config["appid"], config["api_key"], config["mch_id"],
mch_cert=config["mch_cert"], mch_key=config["mch_key"])
7.2.2 创建统一下单接口
在你的后端实现统一下单接口。
from flask import Flask, request, jsonify
import random
import string
app = Flask(__name__)
def generate_order_id():
return ''.join(random.choices(string.ascii_uppercase + string.digits, k=16))
@app.route('/pay/unifiedorder', methods=['POST'])
def create_order():
data = request.json
openid = data.get('openid')
order_id = generate_order_id()
total_fee = data.get('total_fee') # 单位:分
order = wechatpay.order.create({
'trade_type': 'JSAPI',
'body': '商品描述',
'total_fee': total_fee,
'notify_url': config['notify_url'],
'out_trade_no': order_id,
'openid': openid,
})
return jsonify(order)
if __name__ == '__main__':
app.run(debug=True)
7.2.3 接收支付通知
实现支付通知接口,处理微信支付的异步通知。
from flask import Flask, request
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
@app.route('/pay/notify', methods=['POST'])
def notify():
try:
wechatpay.parse_payment_result(request.data)
# 处理订单状态
return wechatpay.reply('SUCCESS', 'OK')
except InvalidSignatureException:
return wechatpay.reply('FAIL', 'Invalid signature')
7.2.4 小程序前端调用微信支付
在小程序前端,调用你后端的统一下单接口,获取支付参数,并调用微信支付接口进行支付。
wx.request({
url: 'https://yourappdomain.com/pay/unifiedorder',
method: 'POST',
data: {
openid: '用户的openid',
total_fee: '商品总价(分)'
},
success(res) {
const paymentData = res.data;
wx.requestPayment({
timeStamp: paymentData.timeStamp,
nonceStr: paymentData.nonceStr,
package: paymentData.package,
signType: 'MD5',
paySign: paymentData.paySign,
success(paymentRes) {
// 支付成功处理
},
fail(err) {
// 支付失败处理
}
});
}
});
8. openid 获取步骤
8.1 前端小程序获取用户登录凭证(code),后与后端交互获取openid
微信小程序的用户登录是通过 wx.login 方法获取登录凭证(code)。
wx.login({
success: function(res) {
if (res.code) {
// 发起网络请求,发送 code 到后端服务器
wx.request({
url: 'https://yourappdomain.com/get_openid',
method: 'POST',
data: {
code: res.code
},
success: function(response) {
// 得到 openid
const openid = response.data.openid;
}
});
} else {
console.log('登录失败!' + res.errMsg);
}
}
});
8.2 后端服务器使用 code 获取用户的 openid
后端服务器需要使用微信提供的接口,通过 code 换取 openid 和 session_key。
8.2.1 获取 openid 和 session_key
微信提供的接口 URL:
https://api.weixin.qq.com/sns/jscode2session?appid=YOUR_APPID&secret=YOUR_SECRET&js_code=JSCODE&grant_type=authorization_code
8.2.2 后端处理代码示例(使用 Flask 和 Requests)
import requests
from flask import Flask, request, jsonify
app = Flask(__name__)
APPID = 'your_app_id'
SECRET = 'your_app_secret'
@app.route('/get_openid', methods=['POST'])
def get_openid():
code = request.json.get('code')
if not code:
return jsonify({'error': 'code is required'}), 400
url = f'https://api.weixin.qq.com/sns/jscode2session?appid={APPID}&secret={SECRET}&js_code={code}&grant_type=authorization_code'
response = requests.get(url)
data = response.json()
if 'openid' in data:
return jsonify({'openid': data['openid']})
else:
return jsonify({'error': 'Failed to get openid'}), 400
if __name__ == '__main__':
app.run(debug=True)
8.2.3 将 openid 用于支付请求
当你获取到 openid 后,可以在支付请求中使用它。
@app.route('/pay/unifiedorder', methods=['POST'])
def create_order():
data = request.json
openid = data.get('openid')
order_id = generate_order_id()
total_fee = data.get('total_fee') # 单位:分
order = wechatpay.order.create({
'trade_type': 'JSAPI',
'body': '商品描述',
'total_fee': total_fee,
'notify_url': config['notify_url'],
'out_trade_no': order_id,
'openid': openid,
})
return jsonify(order)
9、测试与上线
测试支付功能:在测试环境下进行全面测试,确保支付流程正确。
上线支付功能:测试无误后,将支付功能上线。
通过以上步骤,你可以将微信支付功能集成到你的Uni-App小程序中。如果遇到任何问题,可以参考微信支付的官方文档或寻求帮助。