设为首页 收藏本站
查看: 1335|回复: 0

[经验分享] 玩蛇记之用python实现易宝快速支付接口

[复制链接]

尚未签到

发表于 2015-4-22 06:04:35 | 显示全部楼层 |阅读模式
  现在很多这种快速支付的通道,易宝支持的通道算是很全面的,正好最近需要集成易宝的支付通道到平台中,所以写一贴来记录一下,顺便鄙视一下国内的支付平台,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的值连接起来,注意,不加任何间隔符,看看让人吐血的文档
DSC0000.png
  看这段描述,你能猜出是如何构造这个字符串的吗?写这个文档的人多半语文重修不下十次
  根据这段文档唯一有用的一句话参看了源码,于是把源码里啰哩吧嗦的一大篇八股文改为一行代码,搞定
  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,头不痛了,腰不酸了,上楼也有劲了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59317-1-1.html 上篇帖子: Python几种并发实现方案的性能比较 下篇帖子: python django学习-问题记录及解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表