此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观:

http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E4%BB%98%E6%8E%A5%E5%8F%A3%E5%BC%80%E5%8F%91/

 

---------------------------------------------------

支付宝WAP支付接口开发(Node/Coffee语言) 

因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结。由于公司有自己的支付接口,并不直接使用这个接口,所以晚些时候打算把测试代码整理好放到Github上。

1. 开发前准备

  1. 到官网了解此接口的信息,下载样例代码(只有ASP.NET和PHP)以便随时参考。
  2. 一个通过实名认证的企业支付宝账号,并申请开通手机WAP支付功能,我的测试账号是拿公司的,申请流程不清楚,官网有说怎么申请,各位各显神通吧。
  3. 公网域名和node.js环境。下面的代码大多用coffee来表达,不过本文不会贴太多代码,即使对coffee不熟悉也没什么关系。关于coffee可以参考这里

github上有两个开源小项目(搜索 alipay ),但都没有WAP支付功能,可以拿来当参考,可以认为是示例代码的js移植版,结构很相像。我原打算在其中一个项目基础上继续开发,看了代码和接口文档后,还是决定从头开发一个。因为原有代码层次不够清晰,有点过度设计的感觉,而且支付宝的接口很简单,重写工作量不大。

吐槽下: 官网的示例代码真只是示例级(test)而已,跟产品级(production)还隔比较远,感觉还谈不上SDK。接口文档相当的坑爹,正因如此我才觉得有必要好好写篇文章总结。

2. 流程

接口开发最重要的应该是理解数据交互流程了,流程弄清了,并理解为何这么设计,开发起来也是事半功倍

首先,要准备下面几个参数:

a. 企业支付宝账号的PID(也叫ParnerID)和KEY,如果使用RSA签名而不是MD5的话,还要把RSA私钥准备好

b. 支付时用户看到的东西:商品名称(subject)、支付总额(total_fee)、购买数量(通常都是1吧)

c. 交易后的跳转地址,交易成功后用户可以手工点击,或页面延迟自动跳转到这个地址(return_url)

d. 交易状态异步通知地址,交易成功或交易关闭会把消息POST到这个地址(notify_url)

然后,看这幅流程图(不错吧,推荐下这个网站:)

这个流程图基本囊括了整个交互过程,下面是说明:

  1. 用户点击购买按钮(或其他形式),向网站发起购买请求
  2. 网站创建订单,指派一个唯一订单号
  3. 网站把订单号、企业支付宝账号、交易金额、数量等信息,用私钥签名发送给支付宝
  4. 支付宝创建一个交易订单,返回一个交易令牌(token)
  5. 网站按照指定要求,用token和自己的私钥,构造一个重定向得到支付地址
  6. 网站把重定向地址返回给浏览器
  7. 浏览器自动重定向到该地址,即包含了token、网站签名的支付宝交易页面
  8. 支付宝显示当前交易金额、数量、卖家等信息
  9. 用户用自己的支付宝账号支付这笔金额
  10. 支付宝把用户支付成功(或失败)这个消息和订单号加上支付宝的签名,使用HTTP POST的方式通知网站(失败的话,会隔段时间重新发送)
  11. 网站处理交易后续逻辑(发货、订单状态存储之类的)
  12. 网站返回"success"字符串给支付宝,表示该通知已经处理,不用再重发
  13. 支付宝显示支付成功页面给用户(这一步和第10步是不分先后发生的)
  14. 支付成功页面延迟自动跳转,或用户点击“返回商户页面”,跳转到网站的支付结束页面(此时不一定成功处理支付宝发来的通知),但会在URL带上当前的订单号和状态。

可以发现,整个流程有点像OAuth(哎呀,之前那篇文章还没写完呢!),主要分三步:

一是申请支付宝交易号(获取token),这一步可以理解为,让支付宝验证网站的有效性、让网站指定该交易要支付多少钱 二是用户到支付宝页面付款,这一步可以理解为,让支付宝验证用户有效性,让用户在一个不受网站监视的环境下进行支付 三是用户付款后,处理结果页面告诉用户支付成功(同步通知),另外异步通知网站服务器该订单已支付。

支付宝的接口文档说只有两个步骤,感觉不是很好理解,三步还是比较准确的(收钱肯定要办事的嘛)。

好困,细节问题下期继续。。。

posted @ 2013-07-02 01:11 neutra 阅读(13930) 评论(2) 推荐(0) 编辑
摘要: 缘由对于初次接触某个第三方库的C#开发者,假如要调用里面一个方法,发现需要一个A类型的实例作为参数,怎么获得这个实例呢?我想大多数人会先尝试new A吧:如果没有,可能会尝试输入A.看看有没可能的构造方法:要 如果还没有,那一般要通过其他方式获得了(子类、其他方法的返回结果等)。就此打住,因为后面的不在此文讨论范围。我就郁闷了,为何要我输入一次new之后发现没有,然后再次输入A.呢?我指的是,最好让C#编译器支持这样的语法糖:A.new()跟new A()等价。本文不适合的阅读对象文档帝:万事必先看文档的人,本文说明的东西与你无关。键盘帝:不使用VS或者类似的智能提示的用户,本文说明的东西对你 阅读全文
posted @ 2013-06-29 17:19 neutra 阅读(553) 评论(0) 推荐(0) 编辑
摘要: 关于此扩展的任何建议或反馈,欢迎在本文后留言或到腾讯微博@我(@neutra),我将尽可能处理。360的平台审核速度太慢,个人也不怎么喜欢360相关的东西,所以直接放这里了。下载文件后,将crx文件拖到chrome浏览器窗口即可。由于1.x版本使用了NPAPI,Google App Store审核一直没有通过,现采用了Chrome内置的截图API来实现页面截图功能,并放上了Google App Store,这样大家使用时就不需要用开发者模式了。 只是Chrome的截图API限制较多,下面是已知的限制:不可全屏截图,只能页面截图Chrome内置特殊页面无法截图HTTPS页面无法正常截图若需要上述 阅读全文
posted @ 2012-10-01 13:00 neutra 阅读(2195) 评论(2) 推荐(0) 编辑
摘要: 最近在做第三方接入的,初步定下使用OAuth2协议,花了些时间对OAuth2的授权方式做了些了解。 我还记得一两年前,跟一位同事聊起互联网时,当时我说过一个想法: 目前不少较为稀有的资源,很多都是论坛提供下载的,论坛提供的下载往往要求一个论坛帐号,更有甚者,需回帖才可见,又或者下载需要消耗一定的虚拟货币,而这些货币可以用论坛活跃度而获得。假设现在我是一个普通用户,我要找某个资源。通过搜索引擎或者资料,我发现在某个论坛有这个资源下载,从其他地方获得这个资源代价比较高或者说根本就找不着。当我准备下载时,很可能就被提示需登录后才可下载,随机被跳转到注册页面。 为了这个资源注册一个帐号?我想... 阅读全文
posted @ 2012-07-26 06:59 neutra 阅读(70690) 评论(4) 推荐(16) 编辑
摘要: CoffeeScript有个语法叫解构赋值(Destructuring Assignment),可以将一个对象的不同成员一次性赋值给多个的变量。官网中给了下面一个例子:futurists = sculptor: "Umberto Boccioni" painter: "Vladimir Burliuk" poet: name: "F.T. Marinetti" address: [ "Via Roma 42R" "Bellagio, Italy 22021" ]{poet: {name, add 阅读全文
posted @ 2012-07-21 15:33 neutra 阅读(4365) 评论(2) 推荐(0) 编辑
摘要: github真是个好东西,至少在编辑要显示代码的页面时,比传统的WYSIWYG在线编辑器方便一大截,很有LeTeX的味道~1. 基本类型待续 阅读全文
posted @ 2012-07-09 00:28 neutra 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 今天一大早天气很好,翻了几页《Go语言·云动力》,1.5节讲到下面的脑操编程语言++++++++++[>++++++++++<-]>++++.+.额,这不是大名鼎鼎的BF么?终于明白上面的"脑操"不是印刷错误,只是这翻译真不给力,感觉用"脑残"会合适点。(PS: 用BF来讲述图灵机似乎不太合适,虽然BF里有存储/跳转/输出,但是缺少了外部输入,唯一的输入就是代码本身。)虽然之前知道BF解释器很简单,但毕竟从没亲手写过。闲来O疼便打算写个,练习下CoffeeScript也熟悉下github。还好一个小时就测好了,不到30行。为了 阅读全文
posted @ 2012-07-08 08:56 neutra 阅读(583) 评论(0) 推荐(0) 编辑
摘要: 名称:Google搜索结果还原描述:中了关键字陷阱?之前的Google搜索结果打不开?试试这个扩展吧!作者:Neutra版本:1.0更新:2012-06-17在天朝经常使用Google搜索的你,相信对下面这句话绝对不陌生:无法显示此网页与www.google.com.hk的连接已中断。出现这错误后,即使再点击之前搜索的结果,也会提示这个错误,因为所有发往google的请求都会返回这个错误。纠结吗?明明已经得到搜索结果了,就是跳转不过去!你可以等一段时间自动恢复,也可以换个搜索引擎,如果你是个Geeker,还可以用链接地址还原出真实网址手工去访问。不过,我受够了!于是,便做了这个扩展,希望大家喜 阅读全文
posted @ 2012-06-17 15:36 neutra 阅读(7024) 评论(1) 推荐(0) 编辑
摘要: 因为某些原因,最近写了个不停注册某网站账号的chrome扩展。(算外挂吗?) 该网站注册时需要输入验证码,且单次有效,所以穷举不可取。(验证神马的,最讨厌了!)================================================================ 首先要确定验证码图片是实时生成的还是只是静态图片,收集大量验证码看看是不是有大量相同的: 最近erlang代码写得比较多,就用erlang实现了,至于存储,直接放磁盘算了。-export([start/0]).start() -> inets:services(), inets:star... 阅读全文
posted @ 2012-02-26 05:48 neutra 阅读(41696) 评论(5) 推荐(1) 编辑
摘要: 由于项目里Erlang的源代码都是用UTF8编码保存的,注释中有很多中文,结果edoc输出的页面在浏览器下中文都变成了乱码,每次浏览都要指定UTF8编码十分麻烦。用记事本打开HTML看了下,发现没有元数据指定编码,而且文档前面一大串都是英文字符,影响了浏览器的自动识别编码功能,没将文档识别为UTF8编码。既然知道原因,解决办法自然就出来了:在<head>里增加下面一行指定好UTF8编码即可:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />但e 阅读全文
posted @ 2012-02-14 01:28 neutra 阅读(1157) 评论(1) 推荐(0) 编辑
点击右上角即可分享
微信分享提示