微信二次开发案例,python制作微信支付小程序!_可以对支付宝或者微信收款码二次开发吗-程序员宅基地

技术标签: python  网站建设  

最近在琢磨小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程。当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程。

1.支付交互流程

当然具体的参数配置可以参考官方文档

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=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

微信二次开发案例,python制作微信支付小程序!

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><![CDATA[%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密钥两个弄错了,当然如果不是还有可能是其他问题 。

其他的支付方式获取用户的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("""<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[Signature_Error]]></return_msg>""",
content_type=‘text/xml’, status=200)
elif return_code == ‘SUCCESS’:

拿到这次支付的订单号

out_trade_no = xmlmsg[‘xml’][‘out_trade_no’]

根据需要处理业务逻辑

return HttpResponse("""<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>""",
content_type=‘text/xml’, status=200)

5.安全问题

在使用的过程中 商户系统对于支付结果通知的内容一定要做 签名验证,并校验返回的订单金额是否与商户侧的订单金额一致 ,防止数据泄漏导致出现“假通知”,造成资金损失。

我在开发过程中的解决方式是在向微信支付端发起请求的时候, 把订单号,金额,签名等存入数据库,然后在回调函数那里进行校验判断 。在确认跟前面订单情况一样的情况下,才进行后续一系列的操作。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46303424/article/details/106261913

智能推荐

从未在一起更让人遗憾_“从未在一起和最终没有在一起哪个更遗憾”-程序员宅基地

文章浏览阅读7.7k次。图/源于网络文/曲尚菇凉1.今天早上出门去逛街,在那家冰雪融城店里等待冰淇淋的时候,听到旁边两个女生在讨论很久之前的一期《奇葩说》。那期节目主持人给的辩论题是“从未在一起和最终没有在一起哪个更遗憾”,旁边其中一个女生说,她记得当时印象最深的是有个女孩子说了这样一句话。她说:“如果我喜欢一个人呢,我就从第一眼到最后一眼,把这个人爱够,把我的感觉用光,我只希望那些年让我成长的人是他,之后的那些年他喝过..._从未在一起更遗憾

【CSDN精选】基于龙芯1B200的rt-thread基础_龙芯1b200参数-程序员宅基地

文章浏览阅读927次,点赞15次,收藏13次。龙芯是中国的一款自主设计的处理器架构,由中国科学院计算技术研究所(ICT)主导研发。龙芯处理器最早的版本为Loongson-1,其后发展出Loongson-2、Loongson-3等系列。这些处理器主要用于高性能计算、服务器、嵌入式系统等领域。Loongson架构具有独立知识产权,是中国自主研发的一种指令集架构。龙芯的设计旨在实现对计算机体系结构的自主掌握,减少对外部知识产权的依赖。RT-Thread(Real-Time Thread)是一个开源的实时嵌入式操作系统。_龙芯1b200参数

Python函数知识点(详解)-程序员宅基地

文章浏览阅读6w次,点赞584次,收藏2.9k次。本篇总结了Python函数相关的基础知识点,代码案例超详细,欢迎阅读,交流!_python函数知识点

虚拟机如何在net模式下进行联网_虚拟机net网络-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏7次。虚拟机如何在net模式下进行联网(centos7)1.首先你需要先将虚拟机安装好,如果不会可以参考[centos7安装教程](https://blog.csdn.net/qq_44714603/article/details/88829423?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161949204316780274178621%2522%252C%2522scm%2522%253A%252220140713.130102334…_虚拟机net网络

python中的range()函数_python range函数-程序员宅基地

文章浏览阅读6.5w次,点赞59次,收藏241次。range()函数:用于生成一个整数序列;range()的三种创建方式:第一种:只有一个参数(小括号中只给了一个数)即range(stop)例如:range(10)指的是默认从0开始,步长为1,不包括10;注意:的运行结果为:;要想输出0-9的数字序列则应该是的结果为;第二种:range(start,stop) (给了两个参数,即小括号中给了两个数)r=range(1,10) print(list(r)) 运行结果为:;第三种:range(start,stop,step):._python range函数

数据的四种基本存储方法_数据存储-程序员宅基地

文章浏览阅读2.5k次。数据的四种基本存储方法,(1)顺序存储方法(2)链接存储方法(3)索引存储方法(4)散列存储方法_数据存储

随便推点

强化学习在制造业领域的应用:智能制造的未来-程序员宅基地

文章浏览阅读223次,点赞3次,收藏5次。1.背景介绍制造业是国家经济发展的重要引擎,其产能和质量对于国家经济的稳定和发展具有重要意义。随着工业技术的不断发展,制造业的生产方式也不断发生变化。传统的制造业通常依赖于人工操作和手工艺,这种方式的缺点是低效率、低产量和不稳定的质量。随着信息化、智能化和网络化等新技术的出现,制造业开始向智能制造迈出了第一步。智能制造的核心是通过大数据、人工智能、计算机视觉等技术,实现制造过程的智能化、自动化...

ansible--安装与使用_pip安装ansible-程序员宅基地

文章浏览阅读938次。系列文章目录文章目录系列文章目录 前言 一、ansible是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言菜鸟一只,刚开始使用,仅作以后参考使用。边学习,边记录,介绍一下最基础的使用,可能会有理解不到位的地方,可以共同交流,废话不多说,走起。一、ansible 简介?ansible是自动化运维工具的一种,基于Python开发,可以实现批量系统配置,批量程序部署,批量运行命令,ansible是基于模块工作的,它本身没有批量部署的能力,真正.._pip安装ansible

RPMs系列卟啉框架材料ZnMn-RPM/AZn-RPM/FeZn-RPM/ZnPO-MOF齐岳供应金属-四羧基苯基卟啉(M-TCPPs)及三维框架卟啉材料[Cu(TPyP)Cu2Mo3O1]_fezn-5是什么意思-程序员宅基地

文章浏览阅读298次。RPMs系列卟啉框架材料ZnMn-RPM/AZn-RPM/FeZn-RPM/ZnPO-MOF齐岳供应金属-四羧基苯基卟啉(M-TCPPs)及三维框架卟啉材料[Cu(TPyP)Cu2Mo3O1]_fezn-5是什么意思

51单片机与ESP8266-01s模块通讯点灯_51单片机与eps826601s通信-程序员宅基地

文章浏览阅读9.9k次,点赞10次,收藏92次。前言 本文章为方便新手上手直接用最简单的点灯展示,关于ESP8266-01s的AT指令类就上网搜有很多这就不多讲了。接线ESP-01S USB转TTL 51单片机 VCC 3.3V 3.3V GND GND GND EN 3.3V 3.3V TX RX P3.0 RX TX P3.1 IO0(注刷固件时插) GND(注刷固件时插) 一、ESP8266-01S接US..._51单片机与eps826601s通信

麒麟820也迎来鸿蒙系统,魅族适配麒麟820系统 和鸿蒙OS,魅族要入赘华为系-程序员宅基地

文章浏览阅读188次。蜗居在珠海的小厂魅族,虽然是“小厂”,但是其一路走来的历史,一直被科技圈津津乐道,而深入简出的带头大哥黄章,更是魅友的精神领袖。魅族是一个很低调的企业,但是却有这样一种魅力,总能有意无意的成为新闻的主角,比如近日知名科技大V中国IT杂谈发布了这样一条微博:魅族正在适配麒麟820和鸿蒙系统,未来还要加入华为系。关于这条信息的真实性后面再说,我们先来讨论下华为和魅族是否真的可以成为CP,共同走向人生巅..._鸿蒙420支持麒麟820吗

推荐文章

热门文章

相关标签