python微信小程序抢购_Python实现微信小程序支付功能!Python确实强的一批!
正文
由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程。当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程。
1.支付交互流程
2.获取openid(微信用户标识)
import requests
from config import APPID, SECRET
class OpenidUtils(object):
def __init__(self, jscode):
self.url = "https://api.weixin.qq.com/sns/jscode2session"
self.appid = APPID # 小程序id
self.secret = SECRET # 不要跟后面支付的key搞混
self.jscode = jscode # 前端传回的动态jscode
def get_openid(self):
# url一定要拼接,不可用传参方式
url = self.url + "?appid=" + self.appid + "&secret=" + self.secret + "&js_code=" + self.jscode + "&grant_type=authorization_code"
r = requests.get(url)
print(r.json())
openid = r.json()['openid']
return openid
3.支付请求
# -*- coding:utf-8 -*-
import requests
import hashlib
import xmltodict
import time
import random
import string
import urllib2
import sys
class WX_PayToolUtil():
""" 微信支付工具 """
def __init__(self, APP_ID, MCH_ID, API_KEY, NOTIFY_URL):
self._APP_ID = APP_ID # 小程序ID
self._MCH_ID = MCH_ID # # 商户号
self._API_KEY = API_KEY
self._UFDODER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder" # 接口链接
self._NOTIFY_URL = NOTIFY_URL # 异步通知
def generate_sign(self, param):
'''生成签名'''
stringA = ''
ks = sorted(param.keys())
# 参数排序
for k in ks:
stringA += (k + '=' + param[k] + '&')
# 拼接商户KEY
stringSignTemp = stringA + "key=" + self._API_KEY
# md5加密,也可以用其他方式
hash_md5 = hashlib.md5(stringSignTemp.encode('utf8'))
sign = hash_md5.hexdigest().upper()
return sign
'''
# python2另外一种实现方法
def generate_sign(self, params):
ret = []
for k in sorted(params.keys()):
if (k != 'sign') and (k != '') and (params[k] is not None):
ret.append('%s=%s' % (k, params[k]))
params_str = '&'.join(ret)
params_str = '%(params_str)s&key=%(partner_key)s' % {'params_str': params_str, 'partner_key': key}
reload(sys)
sys.setdefaultencoding('utf8')
params_str = hashlib.md5(params_str.encode('utf-8')).hexdigest()
sign = params_str.upper()
return sign
'''
def getPayUrl(self, orderid, openid, goodsPrice, **kwargs):
"""向微信支付端发出请求,获取url"""
key = self._API_KEY
nonce_str = ''.join(random.sample(string.letters + string.digits, 30)) # 生成随机字符串,小于32位
params = {
'appid': self._APP_ID, # 小程序ID
'mch_id': self._MCH_ID, # 商户号
'nonce_str': nonce_str, # 随机字符串
"body": '测试订单', # 支付说明
'out_trade_no': orderid, # 生成的订单号
'total_fee': str(goodsPrice), # 标价金额
'spbill_create_ip': "127.0.0.1", # 小程序不能获取客户ip,web用socekt实现
'notify_url': self._NOTIFY_URL,
'trade_type': "JSAPI", # 支付类型
"openid": openid, # 用户id
}
# 生成签名
params['sign'] = self.generate_sign(params)
# python3一种写法
param = {'root': params}
xml = xmltodict.unparse(param)
response = requests.post(self._UFDODER_URL, data=xml.encode('utf-8'), headers={'Content-Type': 'text/xml'})
# xml 2 dict
msg = response.text
xmlmsg = xmltodict.parse(msg)
# 4. 获取prepay_id
if xmlmsg['xml']['return_code'] == 'SUCCESS':
if xmlmsg['xml']['result_code'] == 'SUCCESS':
prepay_id = xmlmsg['xml']['prepay_id']
# 时间戳
timeStamp = str(int(time.time()))
# 5. 五个参数
data = {
"appId": self._APP_ID,
"nonceStr": nonce_str,
"package": "prepay_id=" + prepay_id,
"signType": 'MD5',
"timeStamp": timeStamp,
}
# 6. paySign签名
paySign = self.generate_sign(data)
data["paySign"] = paySign # 加入签名
# 7. 传给前端的签名后的参数
return data
# python2一种写法
'''
request_xml_str = ''
for key, value in params.items():
if isinstance(value, str):
request_xml_str = '%s<%s>%s%s>' % (request_xml_str, key, value, key,)
else:
request_xml_str = '%s<%s>%s%s>' % (request_xml_str, key, value, key,)
request_xml_str = '%s' % request_xml_str
# 向微信支付发出请求,并提取回传数据
res = urllib2.Request(self._UFDODER_URL, data=request_xml_str.encode("utf-8"))
res_data = urllib2.urlopen(res)
res_read = res_data.read()
doc = xmltodict.parse(res_read)
return_code = doc['xml']['return_code']
if return_code == "SUCCESS":
result_code = doc['xml']['result_code']
if result_code == "SUCCESS":
doc = doc['xml']
data = {
"appId": self._APP_ID,
"nonceStr": nonce_str,
"package": "prepay_id=" + doc["prepay_id"],
"signType": 'MD5',
"timeStamp": str(int(time.time())),
}
# paySign签名
paySign = self.generate_sign(data)
data["paySign"] = paySign # 加入签名
return data
else:
err_des = doc['xml']['err_code_des']
return err_des
else:
fail_des = doc['xml']['return_msg']
return fail_des
'''
当然你可能会遇到的错误有签名错误,一般的情况是你的appSecret和商户号的API密钥两个弄错了,当然如果不是还有可能是其他问题,解决方案链接 https://www.jb51.net/article/166176.htm 。
其他的支付方式获取用户的ip地址可以通过socket.gethostbyname(socket.gethostname())方法来获取。
4.支付回调
# 统一下单回调处理
import xmltodict
from django.http import HttpResponse
def payback(request):
msg = request.body.decode('utf-8')
xmlmsg = xmltodict.parse(msg)
return_code = xmlmsg['xml']['return_code']
if return_code == 'FAIL':
# 官方发出错误
return HttpResponse("""FAIL
Signature_Error""",
content_type='text/xml', status=200)
elif return_code == 'SUCCESS':
# 拿到这次支付的订单号
out_trade_no = xmlmsg['xml']['out_trade_no']
# 根据需要处理业务逻辑
return HttpResponse("""SUCCESS
OK""",
content_type='text/xml', status=200)
在回调的时候可能遇到这样一个问题,支付成功以后没有调回调函数,有可能是回调地址是https然后改为http就行,遇到过这个坑,具体原因也不知道。服务器没有屏蔽https访问,https证书也没有问题,把https改为http最后就可以了。
5.安全问题
在使用的过程中商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
我在开发过程中的解决方式是在向微信支付端发起请求的时候,把订单号,金额,签名等存入数据库,然后在回调函数那里进行校验判断。在确认跟前面订单情况一样的情况下,才进行后续一系列的操作。
最后送给大家一段祝福
# _oo8oo_
# o8888888o
# 88" . "88
# (| -_- |)
# 0\ = /0
# ___/'==='\___
# .' \\| |# '.
# / \\||| : |||# \
# / _||||| -:- |||||_ \
# | | \\\ - #/ | |
# | \_| ''\---/'' |_/ |
# \ .-\__ '-' __/-. /
# ___'. .' /--.--\ '. .'___
# ."" '< '.___\_<|>_/___.' >' "".
# | | : `- \`.:`\ _ /`:.`/ -` : | |
# \ \ `-. \_ __\ /__ _/ .-` / /
# =====`-.____`.___ \_____/ ___.`____.-`=====
# `=---=`
#
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
#
总结
以上所述是小编给大家介绍的Python实现微信小程序支付功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,
python微信小程序抢购_Python实现微信小程序支付功能!Python确实强的一批!相关推荐
- 微信小程序与内嵌网页交互实现支付功能
上个月,小程序开放了新功能,支持内嵌网页,所以我就开始了小程序内嵌网页之路,之前我只是个小安卓. 内嵌网页中可使用JSSDK 1.3.0提供的接口,可坑就来了,居然不支持支付接口的调用,经过一番研究, ...
- 小程序商家如何开通云闪付支付功能
近日,腾讯宣布微信支付支持全量商家小程序场景开通云闪付功能.微信支付实现与云闪付的在小程序支付场景的互联互通,无论是对于小程序商家还是用户而言,都让我们的体验变得更加便捷.那么云闪付支付功能可以满足哪 ...
- 微信小程序python解析获取用户手机号_python获取微信小程序openid及用户信息
填坑记录:1.个人微信公众订阅号是不能申请微信认证的.公众号的类型在注册时一旦选择就不能更改,微信公众号认证的功能除个人订阅号外,都可以申请认证,因而个人订阅号不能申请认证.这句话的意思就是个人订阅号 ...
- 基于python的视频监控系统_Python实现微信监控报警系统
概述: 本文主要分享一下博主在学习wxpy 的过程中开发的一个小程序.博主在最近有一个监控报警的需求需要完成,然后刚好在学习wxpy 这个东西,因此很巧妙的将工作和学习联系在一起. 博文中主要使用到的 ...
- python微信自动发消息_python操作微信自动发消息的实现(微信聊天机器人)
前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已 ...
- python微信自动发消息_Python使用微信itchat接口实现查看自己微信的信息功能详解...
Python使用微信itchat接口实现查看自己微信的信息功能详解 发布时间:2020-09-09 04:20:11 来源:脚本之家 阅读:134 本文实例讲述了Python使用微信itchat接口实 ...
- 用python制作生日蛋糕图片大全_Python 制作微信全家福,你就是朋友圈最亮的仔!...
原标题:Python 制作微信全家福,你就是朋友圈最亮的仔! 目录:0 引言 1 环境2 代码实现3 后记 0 引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出 ...
- python判断性别的源代码_Python 获取微信好友地区、性别、签名信息并将结果可视化...
序言 我之前在CSDN博客上分享过两篇有关 itchat库的教程, 本篇博客是itchat库系列的第三篇文章,它主要实现的功能是获取微信好友地区.性别.签名信息并将结果可视化 正文 根据itchat库 ...
- python下载微信公众号文章_python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。...
需求: 想阅读微信公众号历史文章,但是每次找回看得地方不方便. 思路: 1.使用selenium打开微信公众号历史文章,并滚动刷新到最底部,获取到所有历史文章urls. 2.对urls进行遍历访问,并 ...
最新文章
- 家电 计算机和电讯领域 英语,网络通讯及计算机英语词汇.doc
- 【NLPer必看】NLP领域高质量综述论文
- Golang项目部署
- 作为Web开发人员,我为什么喜欢Google Chrome浏览器
- 转载:thread的六种状态
- Pytho学习笔记:错误,测试,调试(合)
- java代码示例(6-3)
- java 并发线程_Java并发教程–线程之间的可见性
- 为全局变量赋值_实例分析如何远离漫天飞舞的全局变量
- C#LeetCode刷题-深度优先搜索
- 基本配置4-被忽悠进了CentOS 6
- JS将各值拼接JSON串小例
- 725.分隔链表(力扣leetcode) 博主可答疑该问题
- linux不用清理内存吗,清理不必要的Ubuntu磁盘空间占用
- 《OpenGL编程指南》第8版 第9版 VS2015 VS2017配置方法
- 如何在Internet Explorer中使用VARCHART XGantt控件?
- 软件测试(测试开发之测试工具开发1——helloworld)
- 大一c语言作业操作题库,大学C语言考试题库(含答案)
- MapAbc使用体验
- CSDN官方markdown教程