`

玩蛇记之用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的值连接起来,注意,不加任何间隔符,看看让人吐血的文档

image

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

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

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,头不痛了,腰不酸了,上楼也有劲了。

分享到:
评论

相关推荐

    易宝在线支付接口文档

    易宝 支付 文档 易宝支付 易宝支付文档 易宝在线支付接口文档

    易宝支付demo示例(易宝基础产品V1.07)

    1. **易宝支付接口**:易宝支付提供了多种支付接口,包括但不限于银行卡支付、快捷支付、扫码支付等。这些接口允许商家在自己的系统中集成支付功能,为用户提供便捷的支付体验。开发者通过调用这些接口,可以完成...

    易宝支付接口调用和易宝支付开发文档

    易宝支付作为国内知名的第...综上所述,易宝支付接口调用和开发涉及到多个环节,包括接口的理解、代码的实现、服务器的部署以及安全性的保障。开发者应熟练掌握这些知识点,才能顺利地在自己的系统中实现易宝支付功能。

    易宝支付产品通用接口

    通用接口是指易宝支付提供的一套适用于不同业务场景的API集合,这些接口允许开发者通过编程的方式与易宝支付系统进行数据交换,实现支付、退款、查询订单状态等功能。这种接口设计使得开发者无需针对每个具体功能...

    PHP第三方支付易宝支付最新sdk包,其中包含回调。

    在IT行业中,第三方支付服务...总的来说,PHP开发者通过易宝支付的SDK,可以轻松地在自己的项目中实现支付功能,从而提升用户体验,简化支付流程。在实际应用中,还需要结合项目需求,进行适当的安全性和用户体验优化。

    易宝支付通用接口例子

    C#是.NET框架下的编程语言,易宝支付提供了C# SDK,使得开发者可以利用.NET的强大功能来实现支付接口的调用。在C#中,开发者需要了解如何创建HTTP请求,设置请求头,以及解析返回的XML或JSON数据。同时,处理支付...

    易宝支付接口API

    7. **yeepay_bha_example.zip、cfca-example.zip、cfca-app.zip**:这些可能是易宝支付的示例代码或证书样本,帮助开发者快速理解和实现接口。 在实际开发中,开发者需要遵循易宝支付的开发指南,确保所有交易符合...

    易宝支付开发接口文档

    开发接口文档是连接商家系统与易宝支付平台的关键桥梁,它详尽地阐述了如何通过编程方式实现双方的交互,从而进行订单处理、资金转账等业务操作。本文将深入解析易宝支付开发接口文档中的核心知识点。 1. **接口...

    易宝支付产品通用接口帮助文档.7z

    易宝支付作为国内知名的第三方支付平台,为开发者提供了一系列的接口,使得商家和开发者能够集成易宝支付功能,实现在线支付。"易宝支付产品通用接口帮助文档.7z"是一个压缩包,其中包含了易宝支付接口的详细指导,...

    易宝支付的最新接口文档

    易宝支付,作为国内知名的第三方支付平台,提供了一系列的支付接口和服务,帮助企业快速集成支付功能。这份最新的接口文档是开发者进行易宝支付集成的重要参考资料,它涵盖了从基础的支付请求到复杂的交易管理等一...

    易宝支付接口C#版,含帮助文档

    易宝支付接口C#版是针对B2C电子商务商家设计的一种支付解决方案,它允许开发者集成易宝支付的服务,实现在线支付功能。这个压缩包包含了C#语言编写的接口代码库和相关的帮助文档,使得C#开发者能够快速理解和使用...

    易宝支付 网银(含快捷)对外接口文档

    易宝支付 网银(含快捷)对外接口文档易宝支付

    易宝支付教育线支付接口

    易宝支付是在线教育领域的重要参与者,其教育线支付接口为众多教育机构提供了高效、安全的支付解决方案。作为中国最大的教育第三方支付服务提供商,易宝支付致力于满足教育行业的特殊需求,帮助商家无缝接入多种支付...

    易宝支付sdk

    1. **API接口文档**:详细介绍了各种支付功能的调用方法,包括请求参数、返回值和错误代码,是开发者实现支付功能的重要参考。 2. **示例代码**:提供已实现的基础支付功能的示例,如订单创建、支付验证、退款处理...

    易宝支付PHP 版示例

    易宝支付(Yeepay)是中国的一家第三方支付平台,为商家提供安全、便捷的在线支付解决方案。在PHP环境中集成易宝支付,主要是通过API接口与易宝支付服务器进行通信,实现用户支付功能。以下是对易宝支付PHP版示例的...

    易宝支付接口参数文档

    易宝支付作为国内知名的第三方支付平台,为商家提供了一系列便捷的在线支付接口。这份"易宝支付接口参数文档"详细阐述了与易宝支付系统交互时所需的各种参数及其作用,帮助开发者更好地理解和集成易宝支付服务。以下...

    易宝支付demo

    1. **API文档**:通常会包含详细的接口说明,解释了各个接口的功能、参数、返回值以及调用方法,是开发人员实现支付功能的重要参考。 2. **示例代码**:提供各种编程语言(如Java、Python、PHP等)的示例代码,演示...

    net易宝支付接口一点点资料

    易宝支付是中国领先的第三方支付平台,为各种类型的企业提供安全、便捷的支付解决方案。 首先,我们要理解支付接口的基本概念。支付接口,简单来说,是商家网站与支付网关之间的通信桥梁。它允许用户在不离开商家...

Global site tag (gtag.js) - Google Analytics