微信小程序接口调用(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格式的数据转换为字典