转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7686765.html

一:资料阅读

场景介绍:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1

支付流程:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_4

提交刷卡支付:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1

查询订单支付结果:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2

二:配置信息准备

# ========支付相关配置信息===========
_APP_ID = ""; # 公众账号appid
_MCH_ID = ""; # 商户号
_API_KEY = ""; # 微信商户平台(pay.weixin.qq.com) -->账户设置 -->API安全 -->密钥设置,设置完成后把密钥复制到这里
_host_name = socket.gethostname()
_ip_address = socket.gethostbyname(_host_name)
_CREATE_IP = _ip_address; # 发起支付ip # 有关url
_MICROPAY_URL = "https://api.mch.weixin.qq.com/pay/micropay"; #刷卡支付api
_QUERY_URL = "https://api.mch.weixin.qq.com/pay/orderquery"; #查询订单支付结果api

三:编写刷卡支付工具类

1:辅助函数

    def get_sign_for_wx(self, para, key):
'''
根据算法, 生成微信支付签名
:param cr:
:param uid:
:param para:
:param context:
:return:
'''
keylist = list(para.keys())
keylist.sort()
s = ''
for i in range(len(keylist)):
s += str(keylist[i]) + '=' + str(para[keylist[i]])
if i != len(keylist) - 1:
s += '&'
s += '&key=' + key
signmd5 = hashlib.md5()
signmd5.update(s)
sign = (signmd5.hexdigest()).upper()
return sign #拼接xml字符串
def get_xml_data(self, doc, para):
root = doc.createElement('xml')
doc.appendChild(root)
for key, value in sorted(para.items()):
new_node = doc.createElement(key)
node_value = doc.createTextNode(str(value))
new_node.appendChild(node_value)
root.appendChild(new_node)
return doc

2:提交刷卡支付

    def do_micropay(self,orderid,goodsName,goodsPrice,authCode,**kwargs):
'''
刷卡支付
'''
appid = self._APP_ID
mch_id = self._MCH_ID
key = self._API_KEY
nonce_str = str(int(round(time.time() * 1000))) + str(random.randint(1, 999)) + string.join(random.sample(
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z'], 5)).replace(" ", "")
spbill_create_ip = self._CREATE_IP params = {}
params['appid'] = appid
params['mch_id'] = mch_id
params['nonce_str'] = nonce_str
params['out_trade_no'] = orderid.encode('utf-8') # 客户端生成并传过来,参数必须用utf8编码,否则报错
params['total_fee'] = goodsPrice # 单位是分,必须是整数
params['spbill_create_ip'] = spbill_create_ip
params['body'] = goodsName.encode('utf-8') # 中文必须用utf-8编码,否则xml格式错误
params['auth_code'] = authCode doc = dom.Document()
self.get_xml_data(doc, params)
sign = self.get_sign_for_wx(params, self._API_KEY)
params['sign'] = sign
signnode = doc.createElement('sign')
signvalue = doc.createTextNode(sign)
signnode.appendChild(signvalue)
doc.getElementsByTagName('xml')[0].appendChild(signnode) # 向微信刷卡支付发出请求
req = urllib2.Request(self._MICROPAY_URL)
req.headers['Content-Type'] = 'text/xml'
req.data = doc.toprettyxml()
res_data = urllib2.urlopen(req) # 提取支付结果
res_read = res_data.read()
doc = xmltodict.parse(res_read)
return_code = doc['xml']['return_code'] # 结果分析
# 此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
if return_code == 'SUCCESS':
result_code = doc['xml']['result_code']
# 业务结果
if result_code == 'SUCCESS':
buyer = doc['xml']['openid'] #支付者id
return (True, 'SUCCESS', u'支付成功 ',buyer)
elif result_code == 'FAIL':
error_code = doc['xml']['err_code']
error_code_des = doc['xml']['err_code_des']
return (False, error_code, error_code_des,'')
else:
return_msg = doc['xml']['return_msg']
return (False, return_code, return_msg,'')

3:根据订单号查询支付结果

    def do_micropay_query(self,orderid):
appid = self._APP_ID
mch_id = self._MCH_ID
key = self._API_KEY
out_trade_no = orderid.encode('utf-8') # 客户端生成并传过来,参数必须用utf8编码,否则报错
nonce_str = str(int(round(time.time() * 1000))) + str(random.randint(1, 999)) + string.join(random.sample(
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z'], 5)).replace(" ", "") params = {}
params['appid'] = appid
params['mch_id'] = mch_id
params['nonce_str'] = nonce_str
params['out_trade_no'] = out_trade_no doc = dom.Document()
self.get_xml_data(doc, params)
sign = self.get_sign_for_wx(params, self._API_KEY)
params['sign'] = sign
signnode = doc.createElement('sign')
signvalue = doc.createTextNode(sign)
signnode.appendChild(signvalue)
doc.getElementsByTagName('xml')[0].appendChild(signnode) # 发出查询请求
req = urllib2.Request(self._QUERY_URL)
req.headers['Content-Type'] = 'text/xml'
req.data = doc.toprettyxml()
res_data = urllib2.urlopen(req) # 返回查询结果
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':
trade_state = doc['xml']['trade_state']
#支付成功
if trade_state == 'SUCCESS':
buyer = doc['xml']['openid']
return (True, 'SUCCESS', u'支付成功 ',buyer)
#未支付、支付中
elif trade_state == 'NOTPAY':
return (False, 'NOTPAY', u'未支付','')
elif trade_state == 'USERPAYING':
return (False, 'USERPAYING', u'支付中','')
#支付关闭、撤销、失败
elif trade_state == 'CLOSED':
return (False, 'CLOSED', u'支付关闭','')
elif trade_state == 'REVOKED':
return (False, 'REVOKED', u'支付撤销','')
elif trade_state == 'PAYERROR':
return (False, 'PAYERROR', u'支付失败','')
else:
error_code = doc['xml']['err_code']
error_code_des = doc['xml']['err_code_des']
return (False, error_code, error_code_des,'')
else:
return_msg = doc['xml']['return_msg']
return (False, return_code, return_msg,'')

Python实现微信刷卡支付(条码支付)MicroPay的更多相关文章

  1. 支付宝支付-常用支付API详解(查询、退款、提现等)

    所有的接口支持沙盒环境的测试 1.前言 前面几篇文件详细介绍了 支付宝提现.扫码支付.条码支付.Wap支付.App支付 支付宝支付-提现到个人支付宝 支付宝支付-扫码支付 支付宝支付-刷卡支付(条码支 ...

  2. 支付宝支付-常用支付API详解(查询、退款、提现等)-转

    所有的接口支持沙盒环境的测试 1.前言 前面几篇文件详细介绍了 支付宝提现.扫码支付.条码支付.Wap支付.App支付 支付宝支付-提现到个人支付宝 支付宝支付-扫码支付 支付宝支付-刷卡支付(条码支 ...

  3. python开发微信支付学习记录(转)

    前言 微信支付是由微信及财付通联合推出的移动支付创新产品.如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑. 要想开发顺利进行,首先要 ...

  4. Python实现微信支付(三种方式)

    Python实现微信支付(三种方式) 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309054] 在文末有二维码. 一.准备环境 1 ...

  5. Python实现微信扫码支付模式二(NativePay)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7649207.html 核心代码github地址:https://github.com/ygj0930/Pyth ...

  6. 微信公众号中的支付宝支付与微信支付 && 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  7. springboot+支付宝条码支付开发详解

    背景:项目原有乐刷聚合支付,无法参加支付宝.微信等支付机构的官方活动 需求:增加原生支付(支付宝条码支付) 方法: 一.官方文档:https://docs.open.alipay.com/194/10 ...

  8. 支付sdk —— 该组件为封装了 微信,支付宝,银联支付

    [精品]  支付组件 简要说明该组件为封装了 微信,支付宝,银联支付, 一键快速集成,几行代码即可集成 微信,支付宝,银联支付. ## 示例: # 测试账号:1.银联支付:提供测试使用卡号.手机号信息 ...

  9. php微信jsapi支付 支付宝支付 两码合一

    产品开会提出了这样的需求:一个二维码可以微信支付也可以支付宝支付 经过自己的钻研以及询问技术高人(本人代码一般般)和网上搜索 最终实现其功能  我用微信jsapi 和 支付宝网页支付 其实并不怎么难: ...

随机推荐

  1. Android之关于MAC把java7改为java6的方法

    先来个草草草,某天手贱有java6升级为java7了,然后用ant打包发布,然后再一次草草草,居然有冲突勒,网上找了一堆...无果,最后想起直接在.bash_profile上配置环境试试吧,居然通了, ...

  2. Table中collapseColumns,stretchColumns

    collapseColumns  设置需要被隐藏的列序号(序号从0开始) shrinkColumns     设置允许被首夺的列的序号(序号从0开始) stretchColumns    设置允许被拉 ...

  3. Filebeat+Logstash+ElasticSearch+Kibana搭建Apache访问日志解析平台

    对于ELK还不太熟悉的同学可以参考我前面的两篇文章ElasticSearch + Logstash + Kibana 搭建笔记.Log stash学习笔记(一),本文搭建了一套专门访问Apache的访 ...

  4. 简单绕过Chrome密码查看逻辑,查看浏览器已保存的密码

    简单绕过Chrome密码查看逻辑,查看浏览器已保存的密码   利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查 ...

  5. python-opencv旋转图像,保持图像不被裁减

    python-opencv旋转图像,保持图像不被裁减   import cv2 from math import * def remote(img,degree): #degree左转 img = c ...

  6. python读取配置文件的方式

    python读取配置文件的方式 1.从config.ini中读取,后缀无所谓,文件名字也无所谓,不过config.ini是常用写法,所谓见名知意 config.ini内容: [global] ip = ...

  7. Xilinx FFT IP v9.0 使用

    该ip用于实现N=2**m(m=3~16)点FFT的变换, 实现的数学类型包含: A)      定点全精度 B)      定点缩减位宽 C)      块浮点 每一级蝶型运算后舍入或者取整.对于N ...

  8. %date~0,4%和 %time~0,2%等用法详解(转)

    比如在windowscmd命令行窗口执行date命令后这个环境变量的值为当前日期:2014-09-01 星期六 或2014/09/01 周六那么如下的各个操作的意义如下:%date:~0,4% 表示从 ...

  9. jboss支持远程访问配置

    jboss有个特点,在本机启动之后,只能在本机的网页访问 http://localhost:8080,在其他机器上访问不了jboss服务. 1.关闭jboss服务端的防火墙 解决方法如下: (dcm4 ...

  10. 第二章 Base64与URLBase64

    2.1.算法基本规则: 加密的算法公开 加密的密钥不公开 Base64算法公开.密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作. 注意:具体的算法与密钥(对于Ba ...