日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

用python模拟微信支付_微信app支付python代码实现

發(fā)布時(shí)間:2023/12/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用python模拟微信支付_微信app支付python代码实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信app支付python代碼(python2)

python3應(yīng)該差不多,

官方文檔:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1

業(yè)務(wù)流程:

商戶系統(tǒng)和微信支付系統(tǒng)主要交互說(shuō)明:

#步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。

用戶在app頁(yè)面選擇商品,確定數(shù)量,提交訂單,提供必要的參數(shù)

app支付需要的前端參數(shù)

1. body 商品描述

2. total_fee 商品價(jià)格

#步驟2: 商戶后臺(tái)生成本地訂單

生成訂單號(hào),保證唯一性

order_sn = "%s%s%s" % (request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S'),

random.randint(1, 99))

根據(jù)訂單號(hào),生成本地訂單(生成訂單對(duì)象,訂單狀態(tài)肯定是未支付,支付成功的回調(diào)時(shí)再改為支付成功狀態(tài))

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 會(huì)員卡

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:調(diào)用微信支付統(tǒng)一下單接口。參見(jiàn)【統(tǒng)一下單API】。

使用pip install weixin-python==0.5.4(模塊)

1.導(dǎo)入from weixin import Weixin

2.初始化(https://www.cnblogs.com/gjh99/p/10536905.html)

we_chat = Weixin(dict(

#app_id 微信開(kāi)放平臺(tái)審核通過(guò)的應(yīng)用APPID(請(qǐng)登錄open.weixin.qq.com查看,注意與公眾號(hào)的APPID不同)

WEIXIN_APP_ID=WECHAT_APP_ID,

#mch_id 微信支付分配的商戶號(hào)

WEIXIN_MCH_ID=WECHAT_MCH_ID,

#mch_key 微信支付密鑰

WEIXIN_MCH_KEY=WECHAT_MCH_KEY,

#回調(diào)url

WEIXIN_NOTIFY_URL=WECHAT_NOTIFY_URL,

#公鑰文件

WEIXIN_MCH_KEY_FILE='',

#私鑰文件

WEIXIN_MCH_CERT_FILE=''

))

3.調(diào)用模塊封裝好的方法

必傳的參數(shù)如下,微信的支付為分

jsdict = we_chat.jsapi(

#訂單號(hào)

out_trade_no=order_sn,

#商品描述

body=body,

#支付金額

total_fee=int(float(total_fee)*100),

#交易類型

trade_type='APP'

)

4.接收微信后臺(tái)返回的數(shù)據(jù)字典jsdict,需要返回給前臺(tái)

{

"status": 1,

"data": {

"appId": "你的appid",

"package": "prepay_id=wx11162703519516e69f7864b91520314800",

"prepay_id": "wx11162703519516e69f7864b91520314800",

"timeStamp": "1576052824",

"nonceStr": "pqfQOyiMs8d9aAqhS7g8n9WCCyjHPYc6",

"signType": "MD5",

"sign": "396451156447F8DB4590E4ADE5C041AD"

}

}

5.微信app支付需要重新生成簽名

統(tǒng)一下單接口返回正常的prepay_id,再按簽名規(guī)范重新生成簽名后,將數(shù)據(jù)傳輸給APP。參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式為Sign=WXPay

new_sign = app_pay_sign(jsdict, we_chat)

#注意 字典的參數(shù)要跟微信要求的一模一樣,就是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. 重新簽名后將數(shù)據(jù)返回給前端,后臺(tái)就算完成了

jsdict["sign"] = new_sign

7. 寫(xiě)回調(diào)函數(shù)

@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', '')

# 支付結(jié)果,用戶正常支付,會(huì)返回SUCCESS

result_code = data.get('result_code', '')

# check 檢查微信回傳數(shù)據(jù)是否可靠

if not we_chat.check(data):

return HttpResponse(we_chat.reply("簽名驗(yàn)證失敗", 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("簽名驗(yàn)證失敗", False), content_type='text/xml')

#后臺(tái)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', '微信支付測(cè)試')

total_fee = post_data.get('total_fee', 0.01)

if not total_fee:

return Response({"status": 0, "errormsg": "缺少參數(shù)"})

# 訂單號(hào)生成規(guī)則:用戶id+當(dāng)前時(shí)間+隨機(jī)數(shù)

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": "調(diào)用微信統(tǒng)一下單接口失敗,缺少必要參數(shù)"})

jsdict["sign"] = new_sign

return Response({"status": 1, "data": jsdict})

except Exception as e:

return Response({"status": 0, "errormsg": e})

#步驟4:商戶APP調(diào)起微信支付。api參見(jiàn)本章節(jié)【app端開(kāi)發(fā)步驟說(shuō)明】

#步驟5:商戶后臺(tái)接收支付通知。api參見(jiàn)【支付結(jié)果通知API】

#步驟6:商戶后臺(tái)查詢支付結(jié)果。,api參見(jiàn)【查詢訂單API】

總結(jié)

以上是生活随笔為你收集整理的用python模拟微信支付_微信app支付python代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。