玩蛇记之用python实现易宝快速支付接口

玩蛇记之用python实现易宝快速支付接口

现在很多这种快速支付的通道,易宝支持的通道算是很全面的,正好最近需要集成易宝的支付通道到平台中,所以写一贴来记录一下,顺便鄙视一下国内的支付平台,api的支持做得很是差劲,易宝的例子代码居然是错的,这么囧的事情都能出现,可见国内的竞争还是不够激烈啊。

进入主题,今天的任务是要打通支付和支付通知接口,根据一般性规则,通过http协议的支付接口的一般设计都是,通过N个field或者查询参数传递数据,其中一个是验证串,防止篡改数据,每个申请了支付接口的用户都给了一个编号,相当于用户名,一个key,相当于密码,用于加密防篡改字段的盐值。

易宝的字段定义在文档中有,这个文档到处能下到,对发起请求的url这里文档倒没有什么错,但是文档里的例子是POST,把数据放到隐藏表单里,我这里通过构造Get的querystring的方式来发送数据。

根据文档,首先定义数据如下:#用的测试平台的数据

data=[ 
        "", 
        ("p0_Cmd","Buy"), 
        ("p1_MerId","10000432521"), 
        ("p2_Order",transid), 
        ("p3_Amt",str(fee)), 
        ("p4_Cur","CNY"), 
        ("p5_Pid","测试一下嘛"), 
        ("p6_Pcat","test"), 
        ("p7_Pdesc","test"), 
        ("p8_Url","http://")
        ("p9_SAF","1"), 
        ("pa_MP","None"), 
        ("pd_FrpId","ICBC-NET"), 
        ("pr_NeedResponse","1"), 
        ]

第一个“”不是打酱油的,在下面的运算是有用处的,不要当我写错了忽略掉。

首先我们要根据数据来构建待加密的验证源串,根据文档描述也就是把每个field的值连接起来,注意,不加任何间隔符,看看让人吐血的文档

看这段描述,你能猜出是如何构造这个字符串的吗?写这个文档的人多半语文重修不下十次

根据这段文档唯一有用的一句话参看了源码,于是把源码里啰哩吧嗦的一大篇八股文改为一行代码,搞定

origin_str=reduce(lambda x,y:"%s%s"%(x,y[1]),data)

这里用了reduce函数,就是挨个取出list里的数据和下一数据累计运算,运算的方法就是把前一次运算的结果和下一个item作为参数传给reduce的第一个参数,这里是一个lambda表达式,x就是前一次运算的结果,y就是下一个item,因为表达式里默认第一次运算的结果是字符串,所以这就是在data这个列表头上的第一个打酱油的””的来历

接下来需要用hmac来加密字符串,拜伟大的python大婶的神威,我在shell里输入import hmac

回车后居然还真有这个库,省去麻烦一大堆,于是

mac=hmac.new("8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t") 
mac.update(origin_str) 
hash_key=mac.hexdigest()

得到key后,需要构建查询的字符串,这种遍历的操作用python的函数变成支持很是爽,又是一行搞定

query= "".join(["http://tech.yeepay.com:8080/robot/debug.action?",reduce(lambda x,y:"%s&%s=%s"%(x,y[0],y[1]),data).lstrip("&"),"&hmac=",hmac_key])

这里我们再次祭出了reduce大婶

接下来有一个很重要的步骤,就是对中文的编码处理,易宝支持GBK,所以我们需要把这个字符串转换成GBK的编码:

query=unicode(query,"utf8").encode("GBK")

这里我们默认你的文件头部是

#-*- coding:utf-8 –*- 而你的源文件也是utf8编码保存的

剩下的事情很简单了,redirect到这个地址就可以看到测试成功的页面了。

这要注意的是我用的ID,Key,和接口的地址都是测试专用的,要用上正式环境需要用正式环境下的key,id,和接口地址来代替

接下来需要搞定的就是回调地址的程序,这里最重要的就是解析参数和hash参数的防篡改串,也就是参数名为hmac的那个值,这里易宝在文档里和示例程序里都犯了不可饶恕地罪过,在文档和代码里都只说要检测r0~r9开头的参数,但是其实里面有个p1_MerId的参数也要算进去,不然你是永远不可能得出正确的结果的。

验证部分同前面,这里我们假设所有querystring都是框架解析好了,放在一个dict里面

keys=[‘p1_MerId‘, ‘r0_Cmd‘, ‘r1_Code‘, ‘r2_TrxId‘, ‘r3_Amt‘, ‘r4_Cur‘, ‘r5_Pid‘, ‘r6_Order‘, ‘r7_Uid‘, ‘r8_MP‘, ‘r9_BType‘] 
origin=reduce(lambda x,y:"%s%s"%(x,y),[dic[k] for k in keys]) 
mac=hmac.new("8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t") 
mac.update(origin) 
hmac_key=mac.hexdigest()

其实功能这些都是很简单的,不过用上了python,头不痛了,腰不酸了,上楼也有劲了。

玩蛇记之用python实现易宝快速支付接口,布布扣,bubuko.com

时间: 2024-10-10 08:53:55

玩蛇记之用python实现易宝快速支付接口的相关文章

易宝网上支付接口的实现

1 这是payment.php文件<?php    //载入配置文件    require_once 'common.inc.php';?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.

易宝网上支付平台的PHP接口代码

本代码参照自韩顺平149讲视频后5讲,需要学习的朋友可以参考本代码 这是测试图片: 以下是代码部分: 1 <?php 2 3 4 function HmacMd5($data, $key) 5 { 6 7 //需要配置环境支撑iconv,否则中文参数不能正常处理 8 $key = iconv("GB2312", "UTF-8", $key); 9 $data = iconv("GB2312", "UTF-8", $dat

php网上支付易宝

巴巴运动网是通过易宝向招商银行打钱,这个首先易宝是需要审核巴巴运动网的钱来的是否正当不然易宝就成了一个洗钱的工具,这个是犯法的:因为钱的来路不明!财政部是需要抓起来的!所以钱的流向实际上是用户的招商银行的钱通过易宝这个中间工具,然后把钱打到招商银行,所以易宝肯定不会随随便便将钱打到一个银行去! 返回的时候,根据支付的验证码来确定是不是易宝是不是支付成功,然后如果支付成功那么执行这条语句: if($r9_BType==1){/* //假设我们点卡充值 //order 表 // id status

玩蛇(Python)笔记之基础Part3

玩蛇(Python)笔记之基础Part1 一.集合 1.set 无序,不重复序列 {}创建,直接写元素 2.set功能 __init__()构造方法,,使用强制转换就会调用此方法 1 set1 = {'year', 'jiujiujiu'} 2 print(type(set1)) 3 # 创建集合 4 s = set() # 创建空集合 5 li = [11, 22, 11, 22] 6 s = set(li) set 3.集合的基本操作 1 # 操作集合 2 s1 = set() 3 s1.a

玩蛇(Python)笔记之基础Part2

玩蛇(Python)笔记之基础Part2 一.列表 1.列表 别的语言叫数组 python牛逼非要取个不一样的名字 1 age = 23 2 name = ["biubiubiu", "jiujiujiu", 22, age] 3 # namecopy = name 4 # namecopy.pop() 5 print(name) 6 # print(namecopy) List 2.列表取值 正常index 从零开始,,取倒数加负号 倒数第一就是[-1] 3.列表

玩webpy记

本人从来没有接触过web编程,突然对这个产生了兴趣.本人之前学过一些Python语言,有点基础.看到网上有很多关于Python的网络开发的资料,于是想玩一玩. 我所了解的Python网络开发框架有django, webpy.由于本人在web上没有什么基础,于是决定从轻量级的webpy入手. 我这里下载了一个webpy的源码.解压源码包,发现里面有个setup.py,按照说明执行: $ sudo python setup.py install 完成安装,很顺序. 然后,本人就找了一个简单的示例来试

python 之易经启卦

#encoding=utf-8 #这是一个易经的启卦程序,在windows下的python3.3下创建' #启卦要本着易的四原则,无事不占,不动不占,无疑不占.不能乱占. import random banyao = range(1,385) #获取1到384的随机数. fz = [] #爻的阴阳列表 fx = [] #爻符列表 fy = ["初","二","三","四","五","上"

【2020Python修炼记20】Python语法入门—迭代器

[目录] 一.迭代器 1.什么是迭代器 2.为何要有迭代器 3.如何使用迭代器 一.迭代器 1.什么是迭代器 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值#只是单纯地重复,因而不是迭代 while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1 2.为何要有

【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】

一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝支付接口实现java网上支付功能(农业银行). 1.完整源代码:https://github.com/kdyzm/day21_2_pay 2.实现过程的时序图 3.技术要点 (1)使用GET请求的时候必须将全部参数都带上,参数名称参考开发者文档中的请求参数列表 (2)使用PaymentUtil类实现