玩蛇记之用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实现易宝快速支付接口的更多相关文章

  1. 玩蛇记--Python处理海量手机号码

    一.任务描述 上周,老板给我一个小任务:批量生成手机号码并去重.给了我一个Excel表,里面是中国移动各个地区的可用手机号码前7位(如下图),里面有十三张表,每个表里的电话号码前缀估计大概是八千个,需 ...

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

    本代码参照自韩顺平149讲视频后5讲,需要学习的朋友可以参考本代码 这是测试图片: 以下是代码部分: <?php function HmacMd5($data, $key) { //需要配置环境 ...

  3. 易汇金在线支付接口实例。ecshop和shopex,shopnc,iwebshop下完美无错(最新)

    最近为客户的一个在线商城做了一个易汇金在线支付的接口.跟大家分享一下. 1 首先可以模仿其他的接口,比如支付宝,财付通等的接口,构建模块功能文件和语言文件. 功能模块构建: /includes/mod ...

  4. php网上支付易宝

    巴巴运动网是通过易宝向招商银行打钱,这个首先易宝是需要审核巴巴运动网的钱来的是否正当不然易宝就成了一个洗钱的工具,这个是犯法的:因为钱的来路不明!财政部是需要抓起来的!所以钱的流向实际上是用户的招商银 ...

  5. ESP8266 玩板记

    一.前言 esp8266的玩板记,后面应该会去更一些其他东西,这一块内容,这算是收官之战了. IoT,江湖有缘再相会 二.ESP8266实现WiFi杀手/钓鱼 这次的博客做的是一个娱乐性较强的项目. ...

  6. 记一次python + selenium小项目出现的问题与解决办法

    记一次python + selenium小项目出现的问题与解决办法 如何接入代理 def crawl_xdaili(self):#代理 可不用 需要时 解除注释 """ ...

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

    一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝 ...

  8. 【drp 1】使用易宝实现在线支付

    导读:在很多网站上,都会涉及到在线支付的功能,总所周知的有:淘宝.天猫.京东等等.我们常见的支付方式有支付宝.微信钱包.银行卡支付等.本篇博客,将介绍一种使用易宝第三方软件进行在线支付的功能. 一.基 ...

  9. Python+Bottle+Sina SAE快速构建网站

    Bottle是新生一代Python框架的代表,利用Bottle构建网站将十分简单. Sina SAE是国内较出名的云平台之一,十分适用于个人网站的开发或创业公司网站开发. 下面将介绍如果通过Pytho ...

随机推荐

  1. self-training and co-training

    半指导学习(Semi-supervised Learning)的概念说起来一点儿也不复杂,即从同时含有标注数据和未标注数据的训练集中学习模型.半指导学习是介于有指导学习与无指导学习之间的一种机器学习方 ...

  2. CSS 易混淆属性

    1. div中 height和line-height的区别 <div style="height:120px;">是用来规定整个div的高度,文字还是默认会在顶端开始向 ...

  3. RTX系统整合记录

    1.切换数据库RTX常见问题解答五. SQL数据库配置 2.同步系统组织机构 部门同步 用户同步https://blog.csdn.net/qq_21703215/article/details/80 ...

  4. elasticsearch head + xpack 用户名密码访问

    修改配置文件elasticsearch.yml,增加http.cors.allow-headers: Authorization 访问head时,url如下所示:http://192.168.100. ...

  5. sql语言(mysql)

    一.SQL语言 1.DDL (Data Definition Language) 数据库定义语言 2.DML(Data Manipulation Language) 数据库操作语言 3.DQL (Da ...

  6. python 并发编程 socket 服务端 客户端 阻塞io行为

    阻塞io行为 server.accept server.recv client.send recv,accept  分为两个阶段 1.wait for data 对方把数据经过网络延迟送到自己的操作系 ...

  7. phpstorm配置phpunit进行单元测试

    1.配置单元测试目录: (1)autoload.php <?php function autoloader($dir){ spl_autoload_register(function($name ...

  8. Python 入门之 内置模块 -- 序列化模块(json模块、pickle模块)

    Python 入门之 内置模块 -- 序列化模块(json模块.pickle模块) 1.序列化 Python中这种序列化模块有三种: ​ json模块 : ​ 不同语言都遵循的一种数据转化格式,即不同 ...

  9. python网络爬虫(1)静态网页抓取

    获取响应内容: import requests r=requests.get('http://www.santostang.com/') print(r.encoding) print(r.statu ...

  10. git使用以及对应sourceTree

    git上面的几条指令 (1)要想把A合并到B分支上,就需要先切换到B分支上,然后在合并A分支,执行指令: git checkout B // 这是切换到B分支上 git merge A // 这是将A ...