Django实现微信小程序支付的示例代码
1.下载相关的库
微信官方已经提供了方便开发者的SDK,可是使用pip方式下载:
pipinstallwechatpy
2.在项目的settings.py文件添加相关配置
具体的参数需要自己到小程序微信公众平台和微信商户平台获取。
WECHAT={
'APPID':'appid',#小程序ID
'APPSECRET':'appsecret', #小程序SECRET
'MCH_ID':'mch_id',#商户号
'TOTAL_FEE':'1',#总金额,单位为“分”
'SPBILL_CREATE_IP':'127.0.0.1',#终端IP
'NOTIFY_URL':'http://127.0.0.1:8000/wechat/payNotify/',#通知地址
'TRADE_TYPE':'JSAPI',#交易类型
'MERCHANT_KEY':'merchant_key',#商户KEY
'BODY':'商品描述',#商品描述
}
3.给Django项目新建app
- 例如我新建的app为:Pay
- 在settings.py文件的INSTALLED_APPS添加刚才新建的app
4.编写app/views.py:
fromdjango.httpimportHttpResponse
importrequests
importjson
fromdjango.confimportsettings
fromwechatpy.payimportWeChatPay
fromapp_base.base_viewsetimportBaseAPIView
fromrest_frameworkimportpermissions
fromlxmlimportetreeaset
fromrest_frameworkimportstatus
classWeChatPayViewSet(BaseAPIView):
"""
通过小程序前端wx.login()接口获取临时登录凭证code
将code作为参数传入,调用get_user_info()方法获取openid
"""
defget_user_info(self,js_code):
"""
使用临时登录凭证code获取session_key和openid等
支付部分仅需openid,如需其他用户信息请按微信官方开发文档自行解密
"""
req_params={
'appid':settings.WECHAT['APPID'],
'secret':settings.WECHAT['APPSECRET'],
'js_code':js_code,
'grant_type':'authorization_code',
}
user_info=requests.get('https://api.weixin.qq.com/sns/jscode2session',
params=req_params,timeout=3,verify=False)
returnuser_info.json()
defget(self,request):
code=request.GET.get("code",None)
openid=self.get_user_info(code)['openid']
pay=WeChatPay(settings.WECHAT['APPID'],settings.WECHAT['MERCHANT_KEY'],settings.WECHAT['MCH_ID'])
order=pay.order.create(
trade_type=settings.WECHAT['TRADE_TYPE'],#交易类型,小程序取值:JSAPI
body=settings.WECHAT['BODY'],#商品描述,商品简单描述
total_fee=settings.WECHAT['TOTAL_FEE'],#标价金额,订单总金额,单位为分
notify_url=settings.WECHAT['NOTIFY_URL'],#通知地址,异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
user_id=openid#用户标识,trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。
)
wxpay_params=pay.jsapi.get_jsapi_params(order['prepay_id'])
returnHttpResponse(json.dumps(wxpay_params))
classWeChatPayNotifyViewSet(BaseAPIView):
permission_classes=(permissions.AllowAny,)
defget(self,request):
_xml=request.body
#拿到微信发送的xml请求即微信支付后的回调内容
xml=str(_xml,encoding="utf-8")
print("xml",xml)
return_dict={}
tree=et.fromstring(xml)
#xml解析
return_code=tree.find("return_code").text
try:
ifreturn_code=='FAIL':
#官方发出错误
return_dict['message']='支付失败'
#returnResponse(return_dict,status=status.HTTP_400_BAD_REQUEST)
elifreturn_code=='SUCCESS':
#拿到自己这次支付的out_trade_no
_out_trade_no=tree.find("out_trade_no").text
#TODO这里省略了拿到订单号后的操作看自己的业务需求
exceptExceptionase:
pass
finally:
returnHttpResponse(return_dict,status=status.HTTP_200_OK)
补充一些继承的类:
#-*-coding:utf-8-*- fromrest_framework.authenticationimportTokenAuthentication fromrest_framework.viewsimportAPIView fromrest_frameworkimportpermissions __author__='JayChen' classBaseAPIView(APIView): permission_classes=(permissions.IsAuthenticated,) #authentication_classes=(TokenAuthentication,)
5.给Payapp添加urls.py并编写:
#-*-coding:utf-8-*- __author__='JayChen' fromdjango.conf.urlsimporturl fromrest_framework.urlpatternsimportformat_suffix_patterns frompayimportviews app_name='pay' urlpatterns=[ #微信小程序支付 url(r'^pay/',views.WeChatPayViewSet.as_view(),name='pay'), #支付结果回调 url(r'^payNotify/',views.WeChatPayNotifyViewSet.as_view(),name='pay_notify'), ]
6.在项目的urls.py添加上面新增的urls.py
fromdjango.contribimportadmin
fromdjango.urlsimportpath,include
fromrest_framework_jwt.viewsimportobtain_jwt_token
urlpatterns=[
path('admin/',admin.site.urls),
path('token_auth/',obtain_jwt_token,name='jwt_token'),
path('user/',include('auth_jwt.urls')),
path('wechat/',include('pay.urls')),#微信支付相关
]
7.调试
微信小程序登陆后会得到一个code,把这个code作为参数发送给Django项目的后端:
例如:http://0.0.0.0:8000/wechat/pay/?code=033h0P0w3ANPRU2ntl0w36HHyy1h0P08
注意:这个code每次登录都会返回,并且只能使用一次,然后就失效。
返回的数据:
{
"appId":"wx14b75285dfe1",
"timeStamp":"1595228",
"nonceStr":"1Wtu5lKb6T3fJLiNzc09ay2Z",
"signType":"MD5",
"package":"prepay_id=wx02158826854686197390000",
"paySign":"89599A11E051D3B20FF57"
}
小程序拿到这些数据就能调起支付。
到此这篇关于Django实现微信小程序支付的文章就介绍到这了,更多相关Django实现微信小程序支付内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。