用python模拟微信支付_微信app支付python代码实现
微信app支付python代码(python2)
python3应该差不多,
官方文档:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
业务流程:
商户系统和微信支付系统主要交互说明:
#步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
用户在app页面选择商品,确定数量,提交订单,提供必要的参数
app支付需要的前端参数
1. body 商品描述
2. total_fee 商品价格
#步骤2: 商户后台生成本地订单
生成订单号,保证唯一性
order_sn = "%s%s%s" % (request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
random.randint(1, 99))
根据订单号,生成本地订单(生成订单对象,订单状态肯定是未支付,支付成功的回调时再改为支付成功状态)
def generate_order(user, post_data, order_sn, nickname, openid):
good_kind = post_data.get("good_kind")
good_id = post_data.get('good_id')
paid_amount = post_data.get('paid_amount', 0)
try:
good_kind = int(good_kind)
good_id = int(good_id)
paid_amount = float(paid_amount)
#1 课程 2 会员卡
if good_kind == 1:
course = Course.objects.get(pk=good_id)
record = Record.objects.create(
user=user, course=course, telephone=user.phone, center=get_center_for_appid(),
price=paid_amount, order_sn=order_sn, nickname=nickname, openid=openid)
if not paid_amount:
record.status = 2
record.save()
elif good_kind == 2:
card = Vip.objects.get(pk=good_id)
record = Record.objects.create(
user=user, card=card, price=paid_amount, center=get_center_for_appid(),
order_sn=order_sn, nickname=nickname, telephone=user.phone, openid=openid)
else:
record = None
except Exception as e:
record = None
return record
#步骤3:调用微信支付统一下单接口。参见【统一下单API】。
使用pip install weixin-python==0.5.4(模块)
1.导入from weixin import Weixin
2.初始化(https://www.cnblogs.com/gjh99/p/10536905.html)
we_chat = Weixin(dict(
#app_id 微信开放平台审核通过的应用APPID(请登录open.weixin.qq.com查看,注意与公众号的APPID不同)
WEIXIN_APP_ID=WECHAT_APP_ID,
#mch_id 微信支付分配的商户号
WEIXIN_MCH_ID=WECHAT_MCH_ID,
#mch_key 微信支付密钥
WEIXIN_MCH_KEY=WECHAT_MCH_KEY,
#回调url
WEIXIN_NOTIFY_URL=WECHAT_NOTIFY_URL,
#公钥文件
WEIXIN_MCH_KEY_FILE='',
#私钥文件
WEIXIN_MCH_CERT_FILE=''
))
3.调用模块封装好的方法
必传的参数如下,微信的支付为分
jsdict = we_chat.jsapi(
#订单号
out_trade_no=order_sn,
#商品描述
body=body,
#支付金额
total_fee=int(float(total_fee)*100),
#交易类型
trade_type='APP'
)
4.接收微信后台返回的数据字典jsdict,需要返回给前台
{
"status": 1,
"data": {
"appId": "你的appid",
"package": "prepay_id=wx11162703519516e69f7864b91520314800",
"prepay_id": "wx11162703519516e69f7864b91520314800",
"timeStamp": "1576052824",
"nonceStr": "pqfQOyiMs8d9aAqhS7g8n9WCCyjHPYc6",
"signType": "MD5",
"sign": "396451156447F8DB4590E4ADE5C041AD"
}
}
5.微信app支付需要重新生成签名
统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
new_sign = app_pay_sign(jsdict, we_chat)
#注意 字典的参数要跟微信要求的一模一样,就是data的key要完全和下面的代码一样
def app_pay_sign(jsdict, we_chat):
try:
data = dict()
data["appid"] = jsdict["appId"]
data["partnerid"] = WECHAT_MCH_ID
data["prepayid"] = jsdict["prepay_id"]
data["noncestr"] = jsdict["nonceStr"]
data["timestamp"] = jsdict["timeStamp"]
data["package"] = jsdict["package"]
return we_chat.sign(data)
except KeyError:
return
6. 重新签名后将数据返回给前端,后台就算完成了
jsdict["sign"] = new_sign
7. 写回调函数
@api_view(['POST'])
@permission_classes([AllowAny])
def wechat_callback(request):
if request.method == 'POST':
try:
data = we_chat.to_dict(request.body)
order_sn = data.get('out_trade_no', '')
# 支付结果,用户正常支付,会返回SUCCESS
result_code = data.get('result_code', '')
# check 检查微信回传数据是否可靠
if not we_chat.check(data):
return HttpResponse(we_chat.reply("签名验证失败", False))
if result_code == 'SUCCESS':
return HttpResponse(we_chat.reply("OK", True), content_type='text/xml')
except Exception as e:
return HttpResponse(we_chat.reply("签名验证失败", False), content_type='text/xml')
#后台python代码
class WeChatPayViewSet(viewsets.ViewSet):
permission_classes = (IsAuthenticated,)
@list_route(methods=["POST"])
def app_pay(self, request, *args, **kwargs):
try:
post_data = request.DATA
body = post_data.get('body', '微信支付测试')
total_fee = post_data.get('total_fee', 0.01)
if not total_fee:
return Response({"status": 0, "errormsg": "缺少参数"})
# 订单号生成规则:用户id+当前时间+随机数
order_sn = "%s%s%s" % (request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
random.randint(1, 99))
# 生成本地订单
order = generate_order()
jsdict = we_chat.jsapi(out_trade_no=order_sn, body=body, total_fee=int(float(total_fee)*100),
trade_type='APP')
jsdict["prepay_id"] = jsdict.get("package").split("=")[-1]
new_sign = app_pay_sign(jsdict, we_chat)
if not new_sign:
return Response({"status": 0, "errormsg": "调用微信统一下单接口失败,缺少必要参数"})
jsdict["sign"] = new_sign
return Response({"status": 1, "data": jsdict})
except Exception as e:
return Response({"status": 0, "errormsg": e})
#步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
#步骤5:商户后台接收支付通知。api参见【支付结果通知API】
#步骤6:商户后台查询支付结果。,api参见【查询订单API】
用python模拟微信支付_微信app支付python代码实现相关推荐
- 微信开放平台手机APP支付
PHP对接APP微信支付 微信开放平台手机APP支付总结 1. 微信开放平台手机APP支付总结 支付功能链接: https://pay.weixin.qq.com/wiki/d ...
- java app支付_【支付宝支付】Java实现支付宝APP支付流程
前言 官方文档 开放能力文档: APP支付接口API 开发准备工作 后端代码实现 参数配置 application.yml # 支付宝相关 ALIPAY: # 应用ID APP_ID: # 应用私钥 ...
- springboot 银联支付(手机app支付)
springboot 银联支付(手机app支付) 应用:在手机app中使用银联支付,支持安卓.ios 官方文档:https://open.unionpay.com/tjweb/acproduct/li ...
- php如何模拟网页点击按钮,python模拟点击网页按钮如何实现 python模拟点击网页按钮实现方法...
python模拟点击网页按钮如何实现 python模拟点击网页按钮实现方法 本篇文章小编给大家分享一下python模拟点击网页按钮实现方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们 ...
- Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松!...
Payssion,海外本地支付_海外本地收款_小语种本地支付_外贸收款_外贸网店收款_欧洲本地支付_俄罗斯本地支付_巴西支付_跨境支付_PAYSSION,让跨境支付更轻松! Payssion,海外本地 ...
- app提现到微信开通流程图_微信支付商户平台app支付开通方法详解
一.创建移动应用 1.创建移动应用之前,必须得有微信开放平台的认证账号,如无可查阅"网创商盟"历史消息进行申请认证操作. 2.登录微信开放平台创建移动应用,按照页面填写一下信息,包 ...
- python自动发微信新闻_微信群总有人发广告?用Python写一个自动化机器人消灭他...
作者 | 刘早起 出品 | 早起Python(ID: zaoqi-python) 或者是一声不吭的去骚扰每一个群成员. 虽然不清楚是什么能够驱使他们这样不折不扣的努力成为最强微信群牛皮癣(可能是钞能力 ...
- 支付宝 实现 移动网页支付、PC网页支付、混合APP支付(支持微信支付)
1.移动网页支付 支付宝开放平台中申创建移动网页应用: 前端比较省事 1.若后台返回的是form表单执行以下代码,每次用完及时销毁: 当然不想写承载页的还有其他方法调起支付,具体逻辑具体分析,根据不同 ...
- java商户平台微信支付宝支付_微信支付/支付宝支付/银联支付,对比加总结(Java服务端)...
今天来讲讲支付. 工作到现在,接入过好几个项目的支付,其中涉及到了微信支付.支付宝支付.银联支付. 三种支付的对接感受其实整体上大同小异.都遵循同一个流程: 1).商户APP向商户服务器请求生成订单 ...
- android个人支付功能,个人app支付接入(三分钟搞定个人微信支付,支付宝支付问题)---贝贝支付...
前言 想必很多人个人开发者和我有同样的感触,想要在自己开发的app中接入微信支付和支付宝支付,仅仅是去申请支付接口就把我们挡在了门外,微信和支付宝都只对接企业的,那不是想逼死我们个人开发者吗?一开始使 ...
最新文章
- 虚拟化入门:用虚拟机安装RHEL 5(下)
- 浅析人脸检测之Haar分类器方法
- Makefile 学习 1
- js 调用 oc 的解释
- SMOTE/SMOTEEN 处理不平衡数据集
- dbvisualizer free 9.5.6中文乱码
- Idea为什么全局搜索会失效?
- 多个生产者多个消费者,只有5个包子
- 用excel做线性规划
- Quartus II 12.1安装及破解
- android viewholder静态,Android listview viewholder
- 基于java web的房屋出租管理系统-学生毕业设计
- 微软输入法和搜狗输入法中的双拼
- Joplin+七牛云+vscode 免费云端同步笔记工具(跨平台)
- Unity3d下载大型文件并显示进度
- 气象数据下载网站(存档)
- 【基于obs插件-10】-鼠标,键盘,游戏柄展示插件
- 单链表的基本操作,建立单链表,插入删除等
- 基于canoe 新建一个lin工程_canoe canalyzer 区别
- win10系统samba服务器,win10系统访问nAs/samba服务器失败的操作技巧