起因:
因公司项目需要网上充值功能,从而对接微信支付,目前也只对接了微信支付的小程序支付功能,在网上找到的都是对接微信支付V2版本接口,与我所对接的接口版本不一致,无法使用,特此记录下微信支付完成功能,使用Django完成后端功能,此文章用于记录使用,
以下代码仅供参考,如若直接商用出现任何后果请自行承担,本人概不负责。
功能:
调起微信支付,微信回调
代码:
1、准备工作:
mchid = "xxxxxx" # 商户号
pay_key = "xxxxxx" # 商户秘钥V3 使用V3接口必须使用V3秘钥
serial_num = "xxxxxx" # 证书序列号
# ======================前三个参数在微信支付中可找到===============================
# ============ 商户号(mchid ) 在账户中心——商户信息——微信支付商户号 (是纯数字) ==================
# ============= 商户秘钥(pay_key) 在账户中心——API安全——APIv3秘钥 (需手动设置) ===================
# ============= 证书序列号(serial_num) 在账户中心——API安全——API证书 (需手动申请,通过后会有串证书序列号),申请完成后需要把证书下载到项目中,便于使用 ===================
appid = "xxxxxx" # 微信小程序appid
wx_secret ="xxxxxx" # 微信小程序秘钥
# ============= 微信小程序appid 在产品中心——AppID账号管理——添加关联的AppID ===================
WX_Pay_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"
# ============= 微信支付调用地址,用于请求接收 预支付交易会话标识: prepay_id ===================
WX_Notify_URL = "https://127.0.0.1:8000"
# ============= 接收微信支付回调地址,必须是https ===================
2、调起微信支付(后端只能请求微信支付接口向微信支付官方获取到预支付交易会话标识,并返回给前端,前端才能调起输入密码支付界面)
import json
import decimal
import traceback
import requests
from django.http import HttpResponse
def payment_view(request, *args, **kwargs):
"""
微信支付(小程序)
:param request:
:param args:
:param kwargs:
:return:
"""
try:
reqdata = json.loads(request.body)
# 前端参数
jscode = reqdata["jscode"] # 微信ID
price = decimal.Decimal(reqdata["price"]).quantize(decimal.Decimal("0.00")) # 充值金额,保留两位小数
nickname = reqdata["nickname"] # 微信昵称/支付宝名称 前端获取到返给后端做记录,可要可不要的字段
paymode = reqdata["paymode"] # 支付方式 1微信支付
remark = reqdata["remark"] # 支付内容描述
# 根据jscode 获取openID
rets = requests.get(url = "https://api.weixin.qq.com/sns/jscode2session?" \
"appid=%s&secret=%s&js_code=%s" \
"&grant_type=authorization_code" % (appid,wx_secret, js_code), timeout=3, verify=False)
if not rets:
return HttpResponse(general_error_msg(msg="未获取到微信信息"))
# 0.获取支付的微信openid
print(f"组织ID:{userinfo['orgid']}, jscode:{jscode}")
wxuser = getappopenid(orgid, jscode)
if wxuser:
# session_key = wxuser["session_key"]
openid = wxuser["openid"]
else:
return HttpResponse(general_error_msg(msg="未获取到微信用户信息"))
# 1.以交易日期生成交易号
orderno = order_num()
# 2.生成新交易记录 paystatus 支付状态 1成功 0待支付 -1支付失败
conorder.objects.create(orderno=orderno, openid=openid, openname=nickname,
paymode=paymode,goodstotalprice=price, paystatus=0,
remark=remark,createtime=get_now_time(1))
# 3.生成统一下单的报文body
url = WX_Pay_URL
body = {
"appid": appid,
"mchid": mchid,
"description":