相关文章推荐
仗义的眼镜  ·  Inno ...·  1 年前    · 
焦虑的皮带  ·  c++关闭窗口-掘金·  1 年前    · 

微信小程序接口调用(Python的flask框架做后端)

小程序端:

HTML:

这里我们写了一个登录按钮,一个支付按钮,得先登录才可以进行支付。

<!-- 在小程序页面中引入前端界面 -->
<view class="container">
  <button class="login-btn" bindtap="login">登录</button>
  <button class="pay-btn" bindtap="pay">支付199</button>
</view>

JS:

Page({
  // 点击登录按钮时,调用该方法
  async login() {
    // 调用微信登录接口,获取用户code
    const { code } = await wx.login()
    // 调用后端接口,获取openid
    const { data: { openid } } = await wx.request({
      url: 'http://localhost:5000/login',//这里是自己的后台地址,也就是后面的python代码
      method: 'POST',
      data: { code }
    // 保存openid到本地缓存中
    wx.setStorageSync('openid', openid)
  // 点击支付按钮时,调用该方法
  async pay() {
    // 从本地缓存中获取openid
    const openid = wx.getStorageSync('openid')
    // 调用支付接口
    const { data } = await wx.request({
      url: 'http://localhost:5000/pay',
      method: 'POST',
      data: {
        body: '商品描述',
        out_trade_no: '商户订单号',
        total_fee: 199,
        openid
    // 调用微信支付接口,完成支付操作
    wx.requestPayment({
      timeStamp: data.timeStamp,
      nonceStr: data.nonceStr,
      package: data.package,
      signType: data.signType,
      paySign: data.paySign,
      success: function(res) {
        // 支付成功,跳转到支付成功页面
        wx.navigateTo({ url: '/pages/success' })

必须在登陆后才可以进行支付接口的调用,下面是python后台的处理,用的是flask的框架

from flask import Flask, request
import requests
import json
app = Flask(__name__)
@app.route('/pay', methods=['POST'])
def pay():
    # 获取前端传来的参数
    data = request.json
    # 组装请求参数
    params = {
        'appid': '你的小程序appid',
        'mch_id': '你的商户号',
        'nonce_str': '随机字符串',
        'body': data['body'],  # 商品描述
        'out_trade_no': data['out_trade_no'],  # 商户订单号
        'total_fee': data['total_fee'],  # 订单总金额,单位为分
        'spbill_create_ip': request.remote_addr,  # 用户端实际ip
        'notify_url': '支付成功后的回调地址',
        'trade_type': 'JSAPI',  # 小程序支付类型
        'openid': data['openid']  # 用户openid
    sign = sign(params, '商户密钥')
    params['sign'] = sign
    # 发送请求
    xml_data = dict_to_xml(params)
    response = requests.post('https://api.mch.weixin.qq.com/pay/unifiedorder', data=xml_data.encode('utf-8'))
    # 解析响应
    result = xml_to_dict(response.content.decode('utf-8'))
    # 封装返回结果
    if result['return_code'] == 'SUCCESS':
        if result['result_code'] == 'SUCCESS':
            res = {
                'appId': result['appid'],
                'timeStamp': str(int(time.time())),
                'nonceStr': result['nonce_str'],
                'package': f"prepay_id={result['prepay_id']}",
                'signType': 'MD5'
            res['paySign'] = sign(res, '商户密钥')
            return json.dumps(res)
        else:
            return result['err_code_des']
    else:
        return result['return_msg']
def sign(data, key):
    sorted_keys = sorted(data.keys())
    stringA = '&'.join([f"{key}={data[key]}" for key in sorted_keys])
    stringSignTemp = f"{stringA}&key={key}"
    sign = hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper()
    return sign
def dict_to_xml(data):
    将字典转换为xml格式
    xml_data = ["<xml>"]
    for k, v in data.items():
        xml_data.append(f"<{k}>{v}</{k}>")
    xml_data.append("</xml>")
    return "".join(xml_data)
def xml_to_dict(xml_data):
    将xml格式的数据转换为字典