Lv.的博客

开通微信支付流程

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小程序中。如果遇到任何问题,可以参考微信支付的官方文档或寻求帮助。

posted @ 2024-08-03 11:27  Avatarx  阅读(27)  评论(0编辑  收藏  举报