用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】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python模拟微信支付,您需要使用以下步骤: 1.安装WeChat SDK:使用pip install wechat-sdk在Python环境中安装WeChat SDK。 2.获取微信API密钥和商户号:在微信支付平台上注册账号并获取API密钥和商户号。 3.创建支付请求:构建一个JSON请求,包含交易金额、商户ID、订单ID和其他必要信息。 4.签名请求:将请求转换为字符串格式(可以使用JSON.dumps()函数),并将其与API密钥一起使用MD5哈希进行签名。 5.发起请求:将签名请求作为POST请求发送到微信支付平台。 6.检查响应:收到响应后,您可以检查其状态代码以确保交易已成功。您还可以从响应中提取交易ID,以便以后跟踪交易。 以下是一个简单的Python代码示例,用于模拟微信支付: ```python import json import hashlib import requests # 设置API密钥和商户号 api_key = 'your_api_key' mch_id = 'your_merchant_id' # 构建支付请求 payment_request = { 'appid': 'wx0000000000000000', 'mch_id': mch_id, 'nonce_str': '1234567890', 'out_trade_no': '20180605000001', 'total_fee': 10000, 'spbill_create_ip': '127.0.0.1', 'notify_url': 'http://example.com/notify', 'trade_type': 'APP' } # 签名请求 payment_request_str = json.dumps(payment_request, separators=(',', ':')) payment_request_str += '&key=' + api_key payment_signature = hashlib.md5(payment_request_str.encode('utf-8')).hexdigest().upper() payment_request['sign'] = payment_signature # 发起请求 response = requests.post('https://api.mch.weixin.qq.com/pay/unifiedorder', data=payment_request) # 检查响应 if response.status_code == 200: response_data = xmltodict.parse(response.text) if response_data['return_code'] == 'SUCCESS' and response_data['result_code'] == 'SUCCESS': transaction_id = response_data['transaction_id'] # 记录交易ID并标记付款成功 else: # 处理交易失败的情况 else: # 处理请求失败的情况 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值