最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

手机网站支付开发指南(20110906)

IT圈 admin 50浏览 0评论

2024年2月29日发(作者:瓮子濯)

手机网站支付开发指南

版本1.06

修订历史

版本号

0.1

作者

胡叶军(薛刚)

内容提要

支付宝wap开发指南

核准人

发布日期

0.2

0.3

0.4

1.0

1.01

1.02

1.03

陈枫(炎汐)

陈枫(炎汐)

陈枫(炎汐)

丁朗、曹腾

曹腾

曹腾

洛心

新增接口描述、通知部分说明

修改线上服务器接入地址

交易创建接口新增out_user参数与zero_pay参数

内容梳理修订

新增pay_expire 参数

buyer_account_name参数屏蔽

交易创建接口增加call_back_url参数,授权并执行接口删除此参数,

签名注意事项修改

2009-09-20

2009-11-06

2009-11-26

2010-09-27

2010-10-28

2010-12-27

2011-04-20

1.04

1.05

1.06

洛心

洛心

洛心

内容修订,增加UC浏览器

修改submit_img_url参数

整合支付方式前置

2011-06-29

2011-07-25

2011-09-06

版权信息

本手册中所有的信息为支付宝公司提供。未经过支付宝公司书面同意,接收本手册的人不能复制,公开,泄露手册的部分或全部的内容。

目录

1. 前言........................................................................................................................................................................... 3

2. 接口介绍 .................................................................................................................................................................. 4

2.1

2.2

Wap支付接口 ........................................................................................................................................... 4

浏览器安全支付 ......................................................................................................................................... 4

3. 接口详细说明 .......................................................................................................................................................... 4

3. 1 wap支付服务................................................................................................................................................. 4

3.1.1 支付方式前置(nnel) .................................................................... 4

3.1.1.1 请求样例(request) .................................................................................................................... 4

3.1.1.2 成功返回样例(response) ........................................................................................................ 5

3.1.2

3.1.3

3.1.4

交易创建() ....................................................................... 6

授权并执行(dExecute) .................................................................. 7

处理支付宝系统通知(notify_url) ............................................................................................... 8

3.2 浏览器安全支付服务 ................................................................................................................................. 10

3.2.1

3.2.2

3.2.3

3.2.4

实现效果 ....................................................................................................................................... 10

如何让UC浏览器识别出“安全支付”logo ........................................................................ 10

上述例子中的token如何生成 ................................................................................................. 12

处理支付宝系统通知(notify_url) ............................................................................................. 12

4. 附录......................................................................................................................................................................... 12

4.1.

4.2.

4.3.

所有参数查询列表 ................................................................................................................................... 12

错误代码列表 ........................................................................................................................................... 15

签名规范 .................................................................................................................................................... 16

1. 前言

1. 目标

该文档目的是帮助商户WAP应用开发人员准确、快速完成支付宝接口集成。

2. 面向读者

本文档主要面向接入支付宝WAP支付的外部商户的开发人员。

3. 术语

名称

外部商户、合作伙伴

合作伙伴ID

密钥信息

说明

和支付宝进行业务合作的商户

签约后,为商家自动分配的唯一编号。

主要用来对request 和response中数据做签名、验签、解密之用,自助签约系统为每个商户都配置了三种类型密钥信息:MD5、RSA、DSA. 商户可根据本接口的支持种类择一用之。

可供商户web页面访问,集签约、开通接口、获取资料信息等功能于一体的在线系统。URL:

无线商户签约平台

4. 操作流程

 从商户签约平台中获取: 合作伙伴ID(partnerId) 和 密钥信息。

 根据开发指南集成支付宝接口。(可参考已发布官方Demo)

5. 商户交流平台

商户如果在接入过程中碰到疑问,可以通过以下形式进行咨询,支付宝工作人员会给予答复。

 支付宝官方论坛:/?fid=747

2. 接口介绍

2.1 Wap支付接口

2.1.1 商户开发内容描述

步骤一 :调用nnel接口,查询最近使用支付方式和可用支付前置列表,在页面展现。

步骤二 : 调用接口, 提交订单信息,获取token串。

步骤三 : 调用接口 dExecute, 提交token串,跳转到支付宝收银台。

步骤四 : 处理支付宝系统通知。详见

2.1.2 交互模式(调用形式)

基于http/https 的 请求/响应模式。建议使用http请求已适配更多机型。

http请求地址: /service/

https请求地址: :443/service/

2.2 浏览器安全支付

仅需在你的wap页面的html代码中付款的位置增加标签,浏览器安全支付目前是不支持前置银行的支付方式。

3. 接口详细说明

3. 1 wap支付服务

3.1.1 支付方式前置(nnel)

3.1.1.1 请求样例(request)

请使用GET/POST形式提交请求。目前只支持MD5的签名方式。

以下样例分为三类参数:

蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)

红色参数---- 表示该参数非必传。(详见参数列表)

绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)

样例

/cooperate/?service=nnel&sign=a103ebd452e4e5f225d2c6afa95fcd41&partner=2075&out_user=tt&_input_charset=GBK&sign_type=MD5

3.1.1.2 成功返回样例(response)

样例

-

T

-

nnel

2547

test@

MD5

70e79c04e17fa1c18786ecf4533ce9a2

-

-

{"payChannleResult":{"lastestPayChannel":{"name":"中行信用卡快捷支付","cashierCode":"CREDITCARD_BOC"},"supportedPayChannelList":{"supportTopPayChannel":[{"name":"信用卡快捷支付","cashierCode":"CREDITCARD","supportSecPayChannelList":{"supportSecPayChannel":[{"name":"深发","cashierCode":"CREDITCARD_SDB"},{"name":"工行","cashierCode":"CREDITCARD_ICBC"},{"name":"建行","cashierCode":"CREDITCARD_CCB"},{"name":"上海农商","cashierCode":"CREDITCARD_SHRCB"},{"name":"宁夏","cashierCode":"CREDITCARD_NXBANK"},{"name":"更多","cashierCode":"CREDITCARD"}]}},{"name":"借记卡快捷支付","cashierCode":"DEBITCARD","supportSecPayChannelList":{"supportSecPayChannel":[{"name":"工行","cashierCode":"DEBITCARD_ICBC"},{"name":"农行","cashierCode":"DEBITCARD_ABC"},{"name":"中行","cashierCode":"DEBITCARD_BOC"},{"name":"上海农商行","cashierCode":"DEBITCARD_SHRCB"},{"name":"建行","cashierCode":"DEBITCARD_CCB"}]}}]}}}

66da2223034957428fd5447937a41e23

MD5

3.1.1.3. 失败返回样例(response)

样例

F

ILLEGAL_PARTNER

验签内容是 result=xxxxxxxx

验签使用的编码字符集要用GBK否则验签不通过。

result是返回的支付方式前置,根据返回的信息渲染出前置页面:

1. 节点:

payChannleResult:支付方式前置根节点

lastestPayChannel:最近使用支付方式

supportedPayChannelList:一级可用支付前置例表(信用卡,借记卡)

supportSecPayChannelList:二级可用支付前置例表(具体到某个银行,例如:XX信用卡快捷支付)

2. 属性

name:支付方式名称

cashierCode:支付方式编码,(在支付时,商户根据接口传入#cashierCode#来选择对应的支付渠道,该参数为空则默认为支付宝账户支付。此参数需放入接口中的req_data参数中。)

3.1.2 交易创建()

该接口由支付宝提供给商户调用。

3.1.2.1 请求样例(request)

为方便展示故写成GET形式,正式请求时必须使用POST形式,以避免请求内容过长而丢失信息。

以下样例分为三类参数(下划线参数为最外层参数,共8个。只有req_data参数值中包含内层xml标签参数。):

样例

蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)

红色参数---- 表示该参数非必传。(详见参数列表)

绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)

/service/?req_data=商户收银台测试011chenf003@DEBITCARD_ICBC/waptest0504/servlet/CallBack/waptest0504/servlet/NotifyReceiveroutID12310&service=&sec_id=0001&partner=2799&req_id=36&sign=VRVr7adPfsHblFjiBkGWryhKIKt+CaI4Cq2MA2wG1ENVuBAyFDlp3FbttndmID0USlfn22a9/6fQ+X+KPDE09hcTNz3gJ1edUiDWxHXY/ahTexCP79SDtoHx29uepXsHBe32DP0k9jZbfhpT8Ly0+ksuo5VJO0iymxQ87hQPjJw=&format=xml&v=2.0

3.1.2.2 成功返回样例(response)

返回response参数中只要包含res_data参数即可认为成功返回。

当商户使用RSA签名方式时,实际返回的内容如下(其中res_data参数值为加密内容,商户需用商户RSA私钥先进行解密后再验签):

样例

res_data=Cl2Mm1Z2YILG8oYe8%2FngEAvYSM9YYmcqUqLtUCZ10habqYb6poowofjzVG3nsUJY6qlgnRrq%2FxFTtdLdwBDGltV8rwpf1AFB01ydCanpQoFgQg%2Brt79JRQ%2B9CC3E%2Fg148C4F95eJ1FNf0L6taXaMFwxaxrvTAdDHzzvSigy3%2BaKdFh8z2K1Zs4gm2bD39lR1CRXSipOyVFhCZZR9L9N8tQNZbDqnyBu%2FjLdLbvXvEuE4fImZPPbsALecVCvsHL4iKFrquPnhA4Zz%2FZEM%2FoJghXA6xlAO0a1d0h6Os%2Fd83mvDPfmhs3oVjPX3FsXCL18Dg4mdzj3gWllbqLnwamM94g%3D%3D&service=&sec_id=0001&partner=2380&req_id=47&sign=RiyyndPEei2QQc%2FHt1%2FIrmYyW6%2FFKNZFxPUiOcXndAOo3OifNRshRjaLlwEs3d2pBpbmyclfooF7tctFdXcrSM584wgsY%2Bj2o0Z6dXst9lmz%2F4OD%2BL2ubk1DXoLWau0f5NiteIuGqGDWUdXMKRLx1FJ0f%2FMN8GOCUZYN15%2FUE%2FE%3D&v=2.0

样例

当商户使用MD5签名方式时,实际返回的内容如下(其中res_data参数值为明文内容,无需解密)

partner=2799&req_id=60&res_data=20100830e8085e3e0868a466b822350ede5886e8&sec_id=MD5&service=&v=2.0&sign=72a64fb63f0b54f96b10cefb69319e8a

3.1.2.3. 失败返回样例(response)

失败返回无论哪种签名方式,内容都是明文无需解密。

样例

partner=279&req_id=46&res_error=00050005partner illegal合作伙伴没有开通接口访问权限&sec_id=0001&service=&v=2.0&sign=72a64fb63f0b54f96b10cefb69319e8a

3.1.3 授权并执行(dExecute)

该接口由支付宝提供给商户调用。

3.1.3.1 请求样例(request)

Get形式请求。

以下样例分为三类参数(下划线参数为最外层参数,共8个。只有req_data参数值中包含内层xml标签参数。):

蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)

红色参数---- 表示该参数非必传。(详见参数列表)

绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)

样例(如用GET方式请求需要URL Encode):

/service/?req_data=201008309e298cf01c58146274208eda1e4cdf2b&service=dExecute&sec_id=0001&partner=2799&sign=LdXbwMLug8E4UjfJMuYv2KoD5X5F3vHGQsQbZ/rdEQ3eaN4FPal7rhsbZZ/+ZUL1kAKzTQSDdMk87MEWtWO1Yq6rhnt2Tv8Hh6Hb16211VXKgbBCpq861+LopRwegPbGStcwBuAyE4pi6fYlJ6gxzL4tMyeLe+T5XZ0RKRUk00U=&format=xml&v=2.0

3.1.3.2 成功返回页面(response)

3.1.3.3 失败返回页面(response)

3.1.4 处理支付宝系统通知(notify_url)

商户需要提供一个http的URL(例:/servlet/NotifyReceiver)来接受支付宝后台请求。当交易状态发生变化,支付宝后台都会用POST方式主动调用该接口。商户必须在收到trade_status=TRADE_FINISHED(如果签有高级即时到帐协议则trade_status=TRADE_SUCCESS)的请求后才可判定交易成功(其它trade_status状态请求可以不作处理),并返回success(注意:支

付宝需精确匹配该字样,不能包含任何其他的HTML脚本语言)表示通知处理完毕,反之支付宝系统会对同一笔订单进行周期性的通知重发(间隔时间为:2分钟,10分钟,10分钟,1小时,2小时,6小时,15小时共7次)。

3.1.4.1 请求样例(request)

当商户使用RSA签名方式时,商户实际收到支付宝通知请求如下(其中notify_data参数值为加密内容,商户需用商户RSA私钥先进行解密后再验签):

样例:

/servlet/NotifyReceiver?service=&sign=Rw/y4ROnNicXhaj287Fiw5pvP6viSyg53H3iNiJ61D3YVi7zGniG2680pZv6rakMCeXX++q9XRLw8Rj6I1//qHrwMAHS1hViNW6hQYsh2TqemuL/xjXRCY3vjm1HCoZOUa5zF2jU09yG23MsMIUx2FAWCL/rgbcQcOjLe5FugTc=&sec_id=0001&v=1.0¬ify_data=g3ivqicRwI9rI5jgmSHSU2osBXV1jcxohapSAPjx4f6qiqsoAzstaRWuPuutE0gxQwzMOtwL3npZqWO3Z89J4w4dXIY/fvOLoTNn8FjExAf7OozoptUS6suBhdMyo/YJyS3lVALfCeT3s27pYWihHgQgna6cTfgi67H2MbX40xtexIpUnjgxBkmOLai8DPOUI58y4UrVwoXQgdcwnXsfn2OthhUFiFPfpINgEphUAq1nC/EPymP6ciHdTCWRI6l1BgWuCzdFy0MxJLliPSnuLyZTou7f+Z5Mw24FgOacaISB+1/G+c4XIJVKJwshCDw9Emz+NAWsPvq34FEEQXVAeQRDOphJx8bDqLK75CGZX+6fx88m5ztq4ykuRUcrmoxZLJ+PiABvYFzi5Yx2uBMP/PmknRmj1HUKEhuVWsXR0t6EWpJFXlyQA4uxbShzncWDigndD7wbfNtkNLg5xMSFFIKay+4YzJK68H9deW4xqk4JYTKsv8eom9Eg9MrJZiIrFkFpVYPuaw0y/n61UEFYdzEQZz+garCmMYehEAQCGibYUQXBlf1iwTOZdqJIxdgCpSX21MIa9N9jicmFu8OXWZJkdN+UrSyvIcpzRori+U6522ovMz5Z8EzVTfcUENu+dWJRnhFlo6pvm0a3Fq2wBEyUV1/YYS3LaZiPj+wig5BCyJ92QXZnEUEtn87oX5kuzSRuLcVVi8OJIgyQWaWT9N0YFyH5AfV+VDNxu4UYy6KkGtcaVjSvbzDuzThMXs2HDwX3qujq25A/hzJKlgR9EjcumJeF/TM6eS7JS+FKXE1kUXnMnGbokaNemZn2yKlPC1VO4LU77G5v1nUs6MfYFq9HC4FYiQ6Y+hL8RgAMorty/RYT3cZ8SQCTO0bQ+qJuOnx79YEEmCUQc3iJBp0zFKYXIU6viqJYghEs6F3LiK8TvJRo8+ST5hKtnuU5b8R6f9yD8Uek1BruWvlYaA7I3Cc90CDhTyOghL2oCMOoKlxqgXdh3MGm128FOVyCjDLRw04b+kK83JGFMcjyVuhfhoVeETQicUCtFQ9ItlH3uFkB5su+r3399WGSXyGflrTbFhMq7mRztWotL2ATvf/enMBcGSCSCb47OzGxXhMDGZZu4Sq4pdF9fsZVBHgWsB/KS8bwxyvM068NoqnRmI72zgL7WFWumlm88j3K6KPxbB6soDSXRv6drbSv2t93llE5q4SP6GLztAw7UPWGTJLXOFyhyaszvhyZWxsX+C5PbXoCta1/cxt4Sp4WXDjaHn6qHI/Vea28xx8fYV/xK5WTmvFwb0k9eRGCgB6/nzmGV1+lPJuK3pKy3L5LbUP0zJFh5gdPG7DecH+F0uBUC0QNMQ==

当商户使用MD5签名方式时,商户实际收到支付宝通知请求如下(其中notify_data参数值为

明文内容,无需解密。)

样例:

/servlet/NotifyReceiver?service=&sign=Rw/y4ROnNicXhaj287Fiw5pvP6viSyg53H3iNiJ61D3YVi7zGniG2680pZv6rakMCeXX++q9XRLw8Rj6I1//qHrwMAHS1hViNW6hQYsh2TqemuL/xjXRCY3vjm1HCoZOUa5zF2jU09yG23MsMIUx2FAWCL/rgbcQcOjLe5FugTc=&v=1.0&sec_id=MD5¬ify_data=1收银台【41】

de_no>2835dinglang@2010-08-30 10:17:24trade_status_sync1412010-08-30 10:18:152799TRADE_FINISHEDN1.002010-08-30 10:18:26chenf003@2010-08-30 10:18:261.002352509ad84678759176212c247c46bec05303N

3.2 浏览器安全支付服务

3.2.1 实现效果

往右边流程是用户手机没有安装安全支付的情况,需要下载安装,往下是手机已经安装安全支付,直接调起,进入收银台。

3.2.2 如何让UC浏览器识别出“安全支付”logo

仅需在你的wap页面的html代码中付款的位置增加标签

标签接口定义:

为兼容Wml和xhtml网页,支付标签以注释实现。

第一部分:ALIPAYMSP工作显示模式

格式定义:

格式说明:

1) 为[固定格式][定单参数和值采用K=V的方式。]

2) 多个参数之间以“&”号连接

3) 参数名和参数值都全部需要进行Html编码

4) 参数名大小写敏感,建议定义时全部使用小字

样例(红色为固定参数):

固定参数说明:

1) v : 版本号。本期全部写为1.0,本期UC浏览器hardcode只支持1.0,以备后面的协议升级兼容。

2) submit_img_url : 安全支付显示的图标的url

订单参数说明:

1) ordertoken:提交订单信息后返回的token值。

2) timestamp:时间戳。

UC浏览器解析上述标签,会转化为:

如果使用了安全支付按钮后想屏蔽原有的wap支付按钮:

第二部分:ALIPAYMSP工作时隐藏域内容标签模式

xxx-这部分如果安全支付打开将自动隐藏!

格式说明:当浏览器正常工作能发现有ALIPAYMSP标签时将原页面上的部分(不能分析ALIPAYMSP标签浏览器的WAP定单内容)自动隐藏。

3.2.3 上述例子中的token如何生成

如果您之前有接入过支付宝的wap支付产品,那么很简单,你继续调用wap的接口就可以获得token了,更加详细的接口规范和签名规范请参考3.1.1节交易创建()

文档可以在自助签约平台() 产品服务频道的手机网站支付服务下下载到.

3.2.4 处理支付宝系统通知(notify_url)

详见3.1.4

4. 附录

4.1. 所有参数查询列表

参数名 中文描述 类型(精度) 说 明

注意:交易创建、授权并执行两次请求的值不同。

商户必传 参数值样例

ect/dExecute

service 接口名称 String

partner

sec_id

合作伙伴id

String(16)

合作伙伴在支付宝的用户ID,与支付宝签约后自动生成

签名算法。目前只支持MD5和RSA(用0001表示)

请求号用于关联请求与响应,并且防止请求重播。支付宝wap限制来自一个partner的请求号必须唯一。

签名,对request/response中参数签名后的值,详见

参数值必须和样例保持一致

参数值必须和样例保持一致

Y

Y

2955

0001 或 MD5 签名算法 String(4)

req_id 请求号

String(32)

Y

1e925b9b4b0f9281e3898

72020eb70e0fdcfbf404edcbb83bfd81

xml

2.0

encoding="UTF-8"?> 彩票

20080801-1

请求参数格式

接口版本号

String

String

String

Y

Y

Y

format

v

req_data

请求业务参数

String

参数值内容为xml格式,包含内层标签参数

Y

total_fee>50tbbusi003@xxxxx/

彩票

20080801-150

固定标签 String

req_data参数值xml内容中必须包含的固定标签。

Y

seller_account_name>tbbusi003@xxxxx/

subject 商品名称

外部交易号

String(256)

String(64)

订单商品名称

合作伙伴系统的交易号,传递给支付宝系统做外部交易号(不能重复)

Y 彩票

out_trade_no Y

2008080101

用户购买的商品或服务的价total_fee

订单价格 String(15)

格(必须是金额的格式,单位:元)

买家如未能在该设定值范围内支付成功,交易将被关闭。Y 1.01

pay_expire

交易自动关闭时间

Int

单位:“分钟”,值区间

0

交易卖方的支付宝帐号,交易成功后该笔交易的资金会转入这个支付宝帐号中

买家在商户系统的唯一标识,当该out_user支付成功一次后再来支付时,30元内无需密码。

N 10

seller_account_name

卖家帐号

String(100)

Y

tbbusi003@

商户系统out_user

用户唯一标识

商户接受String(32) N

21321211111

notify_url

通知的url

返回商户链接

支付成功String(200)

String

String(200商户接受通知的url,详见 。

用户在支付宝页面可返回商户的链接

由商户提供,只有当交易支付成功之后,才会跳转到该url。

前面调用交易创建接口成功返回后获得的(注当此参数为页面返回时,为固定值)

交易号,该笔交易在支付宝系统的交易号

通知的业务参数,包含交易号、外部交易号、交易状态等信息。

用户的支付方式(商户可不关心该参数)

买家的支付宝账号

交易创建时间

该通知的类型,暂时只有交易

Y

/

/

/

20081113f9d49c20e8e5c8e40b6107ec42259e41

2521

merchant_url

call_back_url

request_token

N

N

跳转链接 )

token String(40)

trade_no

交易号

通知业务参数

String(64)

notify_data

payment_type

String

见例子

支付方式 String

买家账号

String(100)

1

chenf002@

2009-09-29 19:59:24

buyer_email

gmt_create

创建时间 String

notify_type

通知类型 String

状态同步(商户可不关心该参数)

trade_status_sync

quantity

数量 String 购买商品数量 1

notify_time

seller_id

通知时间 String

卖家id String

发送通知的时间

卖家的支付宝账号id

交易的状态。

2009-09-29 19:59:25

2148

trade_status

交易状态 String

TRADE_FINISHED(支付成功),WAIT_BUYER_PAY(等待买家付款)

交易价格是否被修改,Y或

TRADE_FINISHED/

WAIT_BUYER_PAY

is_total_fee_adjust

total_fee

gmt_payment

seller_email

gmt_close

总价是否被修改

String N(本接口创建的交易不会被修改)

即订单金额。单位:元

交易的付款时间,如果交易未付款,没有该属性

卖家的支付宝账号

交易结束的时间

目前和total_fee值相同。单位:元

N

交易总价 String

付款时间 String

卖家账号

交易结束时间

单个商品价格

买家id

String(100)

String

2.21

2009-09-29 19:59:25

youngbeckham@

2009-09-29 19:59:25

price

String 2.21

buyer_id

String 买家的支付宝账号id

唯一识别通知内容,重发相同 2393

2311b764be6fba98f593ba98f7eb7470

N

GBK

notify_id

通知id

是否使用红包

参数编码字符集

String

内容的通知notify_id值不变。

use_coupon

_input_charset

String

String

交易时是否使用红包,Y或N

见签名机制

N

4.2. 错误代码列表

错误代码

0000

0001

说明

系统异常

缺少必要的参数,检查非空参数是否已经传递

0002

0003

0004

0005

0006

0007

ILLEGAL_SIGN

ILLEGAL_SERVICE

ILLEGAL_PARTNER

签名错误,检查签名的参数是否符合支付宝签名规范

服务接口错误,检查service是否传递正确

req_data格式不正确

合作伙伴没有开通接口访问权限,合同是否有效

sec_id不正确,支持0001,MD5

缺少了非空的业务参数

签名错误,检查签名的数据是否符合支付宝签名规范

接口不存在,检查service是否传递正确

无效商户,检查传入的PARTNER值是否正确

ILLEGAL_PARTNER_EXTERFACE 商户接口不存在,该商户没有开通该接口

HAS_NO_PRIVILEGE

SYSTEM_ERROR

无权访问该接口

系统错误

4.3. 签名规范

为了确保数据传输过程中的数据真实性和完整性,支付宝和商户都需要对request/response数据进行签名验证。目前本接口支持的签名算法为MD5、RSA。

4.3.1. 签名注意事项

a . 没有值的参数无需传递,也无需包含到待签名数据中。

b. 签名时将字符转变成字节流时指定的字符集要与_input_charset保持一致。

c. 如果传递了_input_charset参数,那么这个参数也应该包含在待签名数据中。

d. 根据HTTP协议要求,传递参数的值中如果存在特殊字符(如:&、@等),那么该值需要做URL

Encoding,这样请求接受方才能接受到正确的参数值。这种情况下,做签名时使用的应该是原生值而不是encoding后的值。例如:待签名数据是

email=test@&partner=2000&service=test,而不是email=test%&partner=2000&service=test

4.3.2. 用于生成sign的待签名数据构造规则

HTTP传递的所有参数(除sign以外)按照参数名称字符升序的顺序串联起来(如:p1=v1&p2=v2&p3=v3),构成待签名数据。按照sec_id指定的算法对待签名数据进行签名。

例如:调用某接口需要以下参数:

service=cae_charge_agent

partner=2000

email=test@

那么待签名数据就是:email=test@&partner=2000&service=

cae_charge_agent。

4.3.3. 支付宝系统通知待签名数据构造规则

支付宝系统通知待签名数据构造规则比较特殊,为固定顺序。

商户收到如下请求:

/servlet/NotifyReceiver?service=&sign=Rw/y4ROnNicXhaj287Fiw5pvP6viSyg53H3iNiJ61D3YVi7zGniG2680pZv6rakMCeXX++q9XRLw8Rj6I1//qHrwMAHS1hViNW6hQYsh2TqemuL/xjXRCY3vjm1HCoZOUa5zF2jU09yG23MsMIUx2FAWCL/rgbcQcOjLe5FugTc=&v=1.0&sec_id=0001¬ify_data=1

则只需对以下数据验签:

service=&v=1.0&sec_id=0001¬ify_data=1

4.3.4.

签名算法对比

特性 算法

MD5

×

×

×

RSA

×

实现简单

防篡改

防抵赖

加密

电子签名法是否承认

4.3.5. MD5算法签名

定义:MD5是一种摘要生成算法,本来是不能用于签名的。但是,通过在待签名数据之后加上一串私密内容(指令发送、接收双方事先规定好的,这里我们称其为签名密钥),就可以用于签名了。使用这种算法签名只能起到防数据篡改的功能,不能起到签名防抵赖的功能,因为双方都知道签名密钥

 登录 无线商户签约平台 获取

我的产品>>密钥管理 >>安全校验码(MD5)。

 生成sign 值JAVA 示例:content =待签名数据+安全校验码(MD5); String sign =

5Hex(es("utf-8"));

 验签时商户只需用response中的参数签名后和sign值比较,一致说明验签成功。

4.3.6. RSA算法签名

定义:RSA是一种非对称的签名算法,即签名密钥(私钥)与验签名密钥(公钥)是不一样的,私钥用于签名,公钥用于验签名。使用这种算法签名在起到防数据篡改功能的同时,还可以起到防抵赖的作用,因为私钥只有签名者知道。

 用集成文档压缩包中openssl 工具生成一套RSA公私钥。登录 无线商户签约平台,把公钥用txt文件上传至我的产品>>密钥管理>>安全校验码(RSA)>>商户公钥 。并获取 安全校验码(RSA)>>支付宝公钥

RSA密钥生成命令:

生成RSA私钥

openssl genrsa -out rsa_private_ 1024

生成RSA公钥

openssl rsa -in rsa_private_ -pubout -out rsa_public_

将RSA私钥转换成PKCS8格式

openssl pkcs8 -topk8 -inform PEM -in rsa_private_ -outform PEM -nocrypt

 生成sign值的示例代码(非真实代码仅供参考):

content: 按4.3.2生成。 privateKey: openssl生成的私钥。

public String sign(String content, String privateKey) throws Exception {

tory keyFactory =

tance("RSA");

byte[] encodedKey = xt(new ByteArrayInputStream(

es())).getBytes();

// 先base64解码

encodedKey = Base64(encodedKey);

eKey prikey = tePrivate(new

8EncodedKeySpec(encodedKey));

ure signature =

tance("SHA1WithRSA");

gn(prikey);

(es("utf-8"));

byte[] signBytes = ();

String sign = new String(Base64(signBytes));

return sign;

}

 验签JAVA示例代码(非真实代码仅供参考):

content: 按4.3.2 或 4.3.3 生成。

sign : 支付宝返回给商户的sign值。

publicKey :登录无线商户签约平台获取

安全校验码(RSA)>>支付宝公钥

public boolean verify(String content, String sign, String publicKey) throws

Exception {

tory keyFactory =

tance("RSA");

StringWriter writer = new StringWriter();

(new InputStreamReader(new ByteArrayInputStream(publicKey

.getBytes())), writer);

byte[] encodedKey = ng().getBytes();

// 先base64解码

encodedKey = Base64(encodedKey);

Key pubKey = tePublic(new

.X509EncodedKeySpec(encodedKey));

byte[] signed = Base64(es());

ure signature =

tance("SHA1WithRSA");

rify(pubKey);

(es("utf-8"));

boolean verify = (signed);

return verify;

}

2024年2月29日发(作者:瓮子濯)

手机网站支付开发指南

版本1.06

修订历史

版本号

0.1

作者

胡叶军(薛刚)

内容提要

支付宝wap开发指南

核准人

发布日期

0.2

0.3

0.4

1.0

1.01

1.02

1.03

陈枫(炎汐)

陈枫(炎汐)

陈枫(炎汐)

丁朗、曹腾

曹腾

曹腾

洛心

新增接口描述、通知部分说明

修改线上服务器接入地址

交易创建接口新增out_user参数与zero_pay参数

内容梳理修订

新增pay_expire 参数

buyer_account_name参数屏蔽

交易创建接口增加call_back_url参数,授权并执行接口删除此参数,

签名注意事项修改

2009-09-20

2009-11-06

2009-11-26

2010-09-27

2010-10-28

2010-12-27

2011-04-20

1.04

1.05

1.06

洛心

洛心

洛心

内容修订,增加UC浏览器

修改submit_img_url参数

整合支付方式前置

2011-06-29

2011-07-25

2011-09-06

版权信息

本手册中所有的信息为支付宝公司提供。未经过支付宝公司书面同意,接收本手册的人不能复制,公开,泄露手册的部分或全部的内容。

目录

1. 前言........................................................................................................................................................................... 3

2. 接口介绍 .................................................................................................................................................................. 4

2.1

2.2

Wap支付接口 ........................................................................................................................................... 4

浏览器安全支付 ......................................................................................................................................... 4

3. 接口详细说明 .......................................................................................................................................................... 4

3. 1 wap支付服务................................................................................................................................................. 4

3.1.1 支付方式前置(nnel) .................................................................... 4

3.1.1.1 请求样例(request) .................................................................................................................... 4

3.1.1.2 成功返回样例(response) ........................................................................................................ 5

3.1.2

3.1.3

3.1.4

交易创建() ....................................................................... 6

授权并执行(dExecute) .................................................................. 7

处理支付宝系统通知(notify_url) ............................................................................................... 8

3.2 浏览器安全支付服务 ................................................................................................................................. 10

3.2.1

3.2.2

3.2.3

3.2.4

实现效果 ....................................................................................................................................... 10

如何让UC浏览器识别出“安全支付”logo ........................................................................ 10

上述例子中的token如何生成 ................................................................................................. 12

处理支付宝系统通知(notify_url) ............................................................................................. 12

4. 附录......................................................................................................................................................................... 12

4.1.

4.2.

4.3.

所有参数查询列表 ................................................................................................................................... 12

错误代码列表 ........................................................................................................................................... 15

签名规范 .................................................................................................................................................... 16

1. 前言

1. 目标

该文档目的是帮助商户WAP应用开发人员准确、快速完成支付宝接口集成。

2. 面向读者

本文档主要面向接入支付宝WAP支付的外部商户的开发人员。

3. 术语

名称

外部商户、合作伙伴

合作伙伴ID

密钥信息

说明

和支付宝进行业务合作的商户

签约后,为商家自动分配的唯一编号。

主要用来对request 和response中数据做签名、验签、解密之用,自助签约系统为每个商户都配置了三种类型密钥信息:MD5、RSA、DSA. 商户可根据本接口的支持种类择一用之。

可供商户web页面访问,集签约、开通接口、获取资料信息等功能于一体的在线系统。URL:

无线商户签约平台

4. 操作流程

 从商户签约平台中获取: 合作伙伴ID(partnerId) 和 密钥信息。

 根据开发指南集成支付宝接口。(可参考已发布官方Demo)

5. 商户交流平台

商户如果在接入过程中碰到疑问,可以通过以下形式进行咨询,支付宝工作人员会给予答复。

 支付宝官方论坛:/?fid=747

2. 接口介绍

2.1 Wap支付接口

2.1.1 商户开发内容描述

步骤一 :调用nnel接口,查询最近使用支付方式和可用支付前置列表,在页面展现。

步骤二 : 调用接口, 提交订单信息,获取token串。

步骤三 : 调用接口 dExecute, 提交token串,跳转到支付宝收银台。

步骤四 : 处理支付宝系统通知。详见

2.1.2 交互模式(调用形式)

基于http/https 的 请求/响应模式。建议使用http请求已适配更多机型。

http请求地址: /service/

https请求地址: :443/service/

2.2 浏览器安全支付

仅需在你的wap页面的html代码中付款的位置增加标签,浏览器安全支付目前是不支持前置银行的支付方式。

3. 接口详细说明

3. 1 wap支付服务

3.1.1 支付方式前置(nnel)

3.1.1.1 请求样例(request)

请使用GET/POST形式提交请求。目前只支持MD5的签名方式。

以下样例分为三类参数:

蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)

红色参数---- 表示该参数非必传。(详见参数列表)

绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)

样例

/cooperate/?service=nnel&sign=a103ebd452e4e5f225d2c6afa95fcd41&partner=2075&out_user=tt&_input_charset=GBK&sign_type=MD5

3.1.1.2 成功返回样例(response)

样例

-

T

-

nnel

2547

test@

MD5

70e79c04e17fa1c18786ecf4533ce9a2

-

-

{"payChannleResult":{"lastestPayChannel":{"name":"中行信用卡快捷支付","cashierCode":"CREDITCARD_BOC"},"supportedPayChannelList":{"supportTopPayChannel":[{"name":"信用卡快捷支付","cashierCode":"CREDITCARD","supportSecPayChannelList":{"supportSecPayChannel":[{"name":"深发","cashierCode":"CREDITCARD_SDB"},{"name":"工行","cashierCode":"CREDITCARD_ICBC"},{"name":"建行","cashierCode":"CREDITCARD_CCB"},{"name":"上海农商","cashierCode":"CREDITCARD_SHRCB"},{"name":"宁夏","cashierCode":"CREDITCARD_NXBANK"},{"name":"更多","cashierCode":"CREDITCARD"}]}},{"name":"借记卡快捷支付","cashierCode":"DEBITCARD","supportSecPayChannelList":{"supportSecPayChannel":[{"name":"工行","cashierCode":"DEBITCARD_ICBC"},{"name":"农行","cashierCode":"DEBITCARD_ABC"},{"name":"中行","cashierCode":"DEBITCARD_BOC"},{"name":"上海农商行","cashierCode":"DEBITCARD_SHRCB"},{"name":"建行","cashierCode":"DEBITCARD_CCB"}]}}]}}}

66da2223034957428fd5447937a41e23

MD5

3.1.1.3. 失败返回样例(response)

样例

F

ILLEGAL_PARTNER

验签内容是 result=xxxxxxxx

验签使用的编码字符集要用GBK否则验签不通过。

result是返回的支付方式前置,根据返回的信息渲染出前置页面:

1. 节点:

payChannleResult:支付方式前置根节点

lastestPayChannel:最近使用支付方式

supportedPayChannelList:一级可用支付前置例表(信用卡,借记卡)

supportSecPayChannelList:二级可用支付前置例表(具体到某个银行,例如:XX信用卡快捷支付)

2. 属性

name:支付方式名称

cashierCode:支付方式编码,(在支付时,商户根据接口传入#cashierCode#来选择对应的支付渠道,该参数为空则默认为支付宝账户支付。此参数需放入接口中的req_data参数中。)

3.1.2 交易创建()

该接口由支付宝提供给商户调用。

3.1.2.1 请求样例(request)

为方便展示故写成GET形式,正式请求时必须使用POST形式,以避免请求内容过长而丢失信息。

以下样例分为三类参数(下划线参数为最外层参数,共8个。只有req_data参数值中包含内层xml标签参数。):

样例

蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)

红色参数---- 表示该参数非必传。(详见参数列表)

绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)

/service/?req_data=商户收银台测试011chenf003@DEBITCARD_ICBC/waptest0504/servlet/CallBack/waptest0504/servlet/NotifyReceiveroutID12310&service=&sec_id=0001&partner=2799&req_id=36&sign=VRVr7adPfsHblFjiBkGWryhKIKt+CaI4Cq2MA2wG1ENVuBAyFDlp3FbttndmID0USlfn22a9/6fQ+X+KPDE09hcTNz3gJ1edUiDWxHXY/ahTexCP79SDtoHx29uepXsHBe32DP0k9jZbfhpT8Ly0+ksuo5VJO0iymxQ87hQPjJw=&format=xml&v=2.0

3.1.2.2 成功返回样例(response)

返回response参数中只要包含res_data参数即可认为成功返回。

当商户使用RSA签名方式时,实际返回的内容如下(其中res_data参数值为加密内容,商户需用商户RSA私钥先进行解密后再验签):

样例

res_data=Cl2Mm1Z2YILG8oYe8%2FngEAvYSM9YYmcqUqLtUCZ10habqYb6poowofjzVG3nsUJY6qlgnRrq%2FxFTtdLdwBDGltV8rwpf1AFB01ydCanpQoFgQg%2Brt79JRQ%2B9CC3E%2Fg148C4F95eJ1FNf0L6taXaMFwxaxrvTAdDHzzvSigy3%2BaKdFh8z2K1Zs4gm2bD39lR1CRXSipOyVFhCZZR9L9N8tQNZbDqnyBu%2FjLdLbvXvEuE4fImZPPbsALecVCvsHL4iKFrquPnhA4Zz%2FZEM%2FoJghXA6xlAO0a1d0h6Os%2Fd83mvDPfmhs3oVjPX3FsXCL18Dg4mdzj3gWllbqLnwamM94g%3D%3D&service=&sec_id=0001&partner=2380&req_id=47&sign=RiyyndPEei2QQc%2FHt1%2FIrmYyW6%2FFKNZFxPUiOcXndAOo3OifNRshRjaLlwEs3d2pBpbmyclfooF7tctFdXcrSM584wgsY%2Bj2o0Z6dXst9lmz%2F4OD%2BL2ubk1DXoLWau0f5NiteIuGqGDWUdXMKRLx1FJ0f%2FMN8GOCUZYN15%2FUE%2FE%3D&v=2.0

样例

当商户使用MD5签名方式时,实际返回的内容如下(其中res_data参数值为明文内容,无需解密)

partner=2799&req_id=60&res_data=20100830e8085e3e0868a466b822350ede5886e8&sec_id=MD5&service=&v=2.0&sign=72a64fb63f0b54f96b10cefb69319e8a

3.1.2.3. 失败返回样例(response)

失败返回无论哪种签名方式,内容都是明文无需解密。

样例

partner=279&req_id=46&res_error=00050005partner illegal合作伙伴没有开通接口访问权限&sec_id=0001&service=&v=2.0&sign=72a64fb63f0b54f96b10cefb69319e8a

3.1.3 授权并执行(dExecute)

该接口由支付宝提供给商户调用。

3.1.3.1 请求样例(request)

Get形式请求。

以下样例分为三类参数(下划线参数为最外层参数,共8个。只有req_data参数值中包含内层xml标签参数。):

蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)

红色参数---- 表示该参数非必传。(详见参数列表)

绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)

样例(如用GET方式请求需要URL Encode):

/service/?req_data=201008309e298cf01c58146274208eda1e4cdf2b&service=dExecute&sec_id=0001&partner=2799&sign=LdXbwMLug8E4UjfJMuYv2KoD5X5F3vHGQsQbZ/rdEQ3eaN4FPal7rhsbZZ/+ZUL1kAKzTQSDdMk87MEWtWO1Yq6rhnt2Tv8Hh6Hb16211VXKgbBCpq861+LopRwegPbGStcwBuAyE4pi6fYlJ6gxzL4tMyeLe+T5XZ0RKRUk00U=&format=xml&v=2.0

3.1.3.2 成功返回页面(response)

3.1.3.3 失败返回页面(response)

3.1.4 处理支付宝系统通知(notify_url)

商户需要提供一个http的URL(例:/servlet/NotifyReceiver)来接受支付宝后台请求。当交易状态发生变化,支付宝后台都会用POST方式主动调用该接口。商户必须在收到trade_status=TRADE_FINISHED(如果签有高级即时到帐协议则trade_status=TRADE_SUCCESS)的请求后才可判定交易成功(其它trade_status状态请求可以不作处理),并返回success(注意:支

付宝需精确匹配该字样,不能包含任何其他的HTML脚本语言)表示通知处理完毕,反之支付宝系统会对同一笔订单进行周期性的通知重发(间隔时间为:2分钟,10分钟,10分钟,1小时,2小时,6小时,15小时共7次)。

3.1.4.1 请求样例(request)

当商户使用RSA签名方式时,商户实际收到支付宝通知请求如下(其中notify_data参数值为加密内容,商户需用商户RSA私钥先进行解密后再验签):

样例:

/servlet/NotifyReceiver?service=&sign=Rw/y4ROnNicXhaj287Fiw5pvP6viSyg53H3iNiJ61D3YVi7zGniG2680pZv6rakMCeXX++q9XRLw8Rj6I1//qHrwMAHS1hViNW6hQYsh2TqemuL/xjXRCY3vjm1HCoZOUa5zF2jU09yG23MsMIUx2FAWCL/rgbcQcOjLe5FugTc=&sec_id=0001&v=1.0¬ify_data=g3ivqicRwI9rI5jgmSHSU2osBXV1jcxohapSAPjx4f6qiqsoAzstaRWuPuutE0gxQwzMOtwL3npZqWO3Z89J4w4dXIY/fvOLoTNn8FjExAf7OozoptUS6suBhdMyo/YJyS3lVALfCeT3s27pYWihHgQgna6cTfgi67H2MbX40xtexIpUnjgxBkmOLai8DPOUI58y4UrVwoXQgdcwnXsfn2OthhUFiFPfpINgEphUAq1nC/EPymP6ciHdTCWRI6l1BgWuCzdFy0MxJLliPSnuLyZTou7f+Z5Mw24FgOacaISB+1/G+c4XIJVKJwshCDw9Emz+NAWsPvq34FEEQXVAeQRDOphJx8bDqLK75CGZX+6fx88m5ztq4ykuRUcrmoxZLJ+PiABvYFzi5Yx2uBMP/PmknRmj1HUKEhuVWsXR0t6EWpJFXlyQA4uxbShzncWDigndD7wbfNtkNLg5xMSFFIKay+4YzJK68H9deW4xqk4JYTKsv8eom9Eg9MrJZiIrFkFpVYPuaw0y/n61UEFYdzEQZz+garCmMYehEAQCGibYUQXBlf1iwTOZdqJIxdgCpSX21MIa9N9jicmFu8OXWZJkdN+UrSyvIcpzRori+U6522ovMz5Z8EzVTfcUENu+dWJRnhFlo6pvm0a3Fq2wBEyUV1/YYS3LaZiPj+wig5BCyJ92QXZnEUEtn87oX5kuzSRuLcVVi8OJIgyQWaWT9N0YFyH5AfV+VDNxu4UYy6KkGtcaVjSvbzDuzThMXs2HDwX3qujq25A/hzJKlgR9EjcumJeF/TM6eS7JS+FKXE1kUXnMnGbokaNemZn2yKlPC1VO4LU77G5v1nUs6MfYFq9HC4FYiQ6Y+hL8RgAMorty/RYT3cZ8SQCTO0bQ+qJuOnx79YEEmCUQc3iJBp0zFKYXIU6viqJYghEs6F3LiK8TvJRo8+ST5hKtnuU5b8R6f9yD8Uek1BruWvlYaA7I3Cc90CDhTyOghL2oCMOoKlxqgXdh3MGm128FOVyCjDLRw04b+kK83JGFMcjyVuhfhoVeETQicUCtFQ9ItlH3uFkB5su+r3399WGSXyGflrTbFhMq7mRztWotL2ATvf/enMBcGSCSCb47OzGxXhMDGZZu4Sq4pdF9fsZVBHgWsB/KS8bwxyvM068NoqnRmI72zgL7WFWumlm88j3K6KPxbB6soDSXRv6drbSv2t93llE5q4SP6GLztAw7UPWGTJLXOFyhyaszvhyZWxsX+C5PbXoCta1/cxt4Sp4WXDjaHn6qHI/Vea28xx8fYV/xK5WTmvFwb0k9eRGCgB6/nzmGV1+lPJuK3pKy3L5LbUP0zJFh5gdPG7DecH+F0uBUC0QNMQ==

当商户使用MD5签名方式时,商户实际收到支付宝通知请求如下(其中notify_data参数值为

明文内容,无需解密。)

样例:

/servlet/NotifyReceiver?service=&sign=Rw/y4ROnNicXhaj287Fiw5pvP6viSyg53H3iNiJ61D3YVi7zGniG2680pZv6rakMCeXX++q9XRLw8Rj6I1//qHrwMAHS1hViNW6hQYsh2TqemuL/xjXRCY3vjm1HCoZOUa5zF2jU09yG23MsMIUx2FAWCL/rgbcQcOjLe5FugTc=&v=1.0&sec_id=MD5¬ify_data=1收银台【41】

de_no>2835dinglang@2010-08-30 10:17:24trade_status_sync1412010-08-30 10:18:152799TRADE_FINISHEDN1.002010-08-30 10:18:26chenf003@2010-08-30 10:18:261.002352509ad84678759176212c247c46bec05303N

3.2 浏览器安全支付服务

3.2.1 实现效果

往右边流程是用户手机没有安装安全支付的情况,需要下载安装,往下是手机已经安装安全支付,直接调起,进入收银台。

3.2.2 如何让UC浏览器识别出“安全支付”logo

仅需在你的wap页面的html代码中付款的位置增加标签

标签接口定义:

为兼容Wml和xhtml网页,支付标签以注释实现。

第一部分:ALIPAYMSP工作显示模式

格式定义:

格式说明:

1) 为[固定格式][定单参数和值采用K=V的方式。]

2) 多个参数之间以“&”号连接

3) 参数名和参数值都全部需要进行Html编码

4) 参数名大小写敏感,建议定义时全部使用小字

样例(红色为固定参数):

固定参数说明:

1) v : 版本号。本期全部写为1.0,本期UC浏览器hardcode只支持1.0,以备后面的协议升级兼容。

2) submit_img_url : 安全支付显示的图标的url

订单参数说明:

1) ordertoken:提交订单信息后返回的token值。

2) timestamp:时间戳。

UC浏览器解析上述标签,会转化为:

如果使用了安全支付按钮后想屏蔽原有的wap支付按钮:

第二部分:ALIPAYMSP工作时隐藏域内容标签模式

xxx-这部分如果安全支付打开将自动隐藏!

格式说明:当浏览器正常工作能发现有ALIPAYMSP标签时将原页面上的部分(不能分析ALIPAYMSP标签浏览器的WAP定单内容)自动隐藏。

3.2.3 上述例子中的token如何生成

如果您之前有接入过支付宝的wap支付产品,那么很简单,你继续调用wap的接口就可以获得token了,更加详细的接口规范和签名规范请参考3.1.1节交易创建()

文档可以在自助签约平台() 产品服务频道的手机网站支付服务下下载到.

3.2.4 处理支付宝系统通知(notify_url)

详见3.1.4

4. 附录

4.1. 所有参数查询列表

参数名 中文描述 类型(精度) 说 明

注意:交易创建、授权并执行两次请求的值不同。

商户必传 参数值样例

ect/dExecute

service 接口名称 String

partner

sec_id

合作伙伴id

String(16)

合作伙伴在支付宝的用户ID,与支付宝签约后自动生成

签名算法。目前只支持MD5和RSA(用0001表示)

请求号用于关联请求与响应,并且防止请求重播。支付宝wap限制来自一个partner的请求号必须唯一。

签名,对request/response中参数签名后的值,详见

参数值必须和样例保持一致

参数值必须和样例保持一致

Y

Y

2955

0001 或 MD5 签名算法 String(4)

req_id 请求号

String(32)

Y

1e925b9b4b0f9281e3898

72020eb70e0fdcfbf404edcbb83bfd81

xml

2.0

encoding="UTF-8"?> 彩票

20080801-1

请求参数格式

接口版本号

String

String

String

Y

Y

Y

format

v

req_data

请求业务参数

String

参数值内容为xml格式,包含内层标签参数

Y

total_fee>50tbbusi003@xxxxx/

彩票

20080801-150

固定标签 String

req_data参数值xml内容中必须包含的固定标签。

Y

seller_account_name>tbbusi003@xxxxx/

subject 商品名称

外部交易号

String(256)

String(64)

订单商品名称

合作伙伴系统的交易号,传递给支付宝系统做外部交易号(不能重复)

Y 彩票

out_trade_no Y

2008080101

用户购买的商品或服务的价total_fee

订单价格 String(15)

格(必须是金额的格式,单位:元)

买家如未能在该设定值范围内支付成功,交易将被关闭。Y 1.01

pay_expire

交易自动关闭时间

Int

单位:“分钟”,值区间

0

交易卖方的支付宝帐号,交易成功后该笔交易的资金会转入这个支付宝帐号中

买家在商户系统的唯一标识,当该out_user支付成功一次后再来支付时,30元内无需密码。

N 10

seller_account_name

卖家帐号

String(100)

Y

tbbusi003@

商户系统out_user

用户唯一标识

商户接受String(32) N

21321211111

notify_url

通知的url

返回商户链接

支付成功String(200)

String

String(200商户接受通知的url,详见 。

用户在支付宝页面可返回商户的链接

由商户提供,只有当交易支付成功之后,才会跳转到该url。

前面调用交易创建接口成功返回后获得的(注当此参数为页面返回时,为固定值)

交易号,该笔交易在支付宝系统的交易号

通知的业务参数,包含交易号、外部交易号、交易状态等信息。

用户的支付方式(商户可不关心该参数)

买家的支付宝账号

交易创建时间

该通知的类型,暂时只有交易

Y

/

/

/

20081113f9d49c20e8e5c8e40b6107ec42259e41

2521

merchant_url

call_back_url

request_token

N

N

跳转链接 )

token String(40)

trade_no

交易号

通知业务参数

String(64)

notify_data

payment_type

String

见例子

支付方式 String

买家账号

String(100)

1

chenf002@

2009-09-29 19:59:24

buyer_email

gmt_create

创建时间 String

notify_type

通知类型 String

状态同步(商户可不关心该参数)

trade_status_sync

quantity

数量 String 购买商品数量 1

notify_time

seller_id

通知时间 String

卖家id String

发送通知的时间

卖家的支付宝账号id

交易的状态。

2009-09-29 19:59:25

2148

trade_status

交易状态 String

TRADE_FINISHED(支付成功),WAIT_BUYER_PAY(等待买家付款)

交易价格是否被修改,Y或

TRADE_FINISHED/

WAIT_BUYER_PAY

is_total_fee_adjust

total_fee

gmt_payment

seller_email

gmt_close

总价是否被修改

String N(本接口创建的交易不会被修改)

即订单金额。单位:元

交易的付款时间,如果交易未付款,没有该属性

卖家的支付宝账号

交易结束的时间

目前和total_fee值相同。单位:元

N

交易总价 String

付款时间 String

卖家账号

交易结束时间

单个商品价格

买家id

String(100)

String

2.21

2009-09-29 19:59:25

youngbeckham@

2009-09-29 19:59:25

price

String 2.21

buyer_id

String 买家的支付宝账号id

唯一识别通知内容,重发相同 2393

2311b764be6fba98f593ba98f7eb7470

N

GBK

notify_id

通知id

是否使用红包

参数编码字符集

String

内容的通知notify_id值不变。

use_coupon

_input_charset

String

String

交易时是否使用红包,Y或N

见签名机制

N

4.2. 错误代码列表

错误代码

0000

0001

说明

系统异常

缺少必要的参数,检查非空参数是否已经传递

0002

0003

0004

0005

0006

0007

ILLEGAL_SIGN

ILLEGAL_SERVICE

ILLEGAL_PARTNER

签名错误,检查签名的参数是否符合支付宝签名规范

服务接口错误,检查service是否传递正确

req_data格式不正确

合作伙伴没有开通接口访问权限,合同是否有效

sec_id不正确,支持0001,MD5

缺少了非空的业务参数

签名错误,检查签名的数据是否符合支付宝签名规范

接口不存在,检查service是否传递正确

无效商户,检查传入的PARTNER值是否正确

ILLEGAL_PARTNER_EXTERFACE 商户接口不存在,该商户没有开通该接口

HAS_NO_PRIVILEGE

SYSTEM_ERROR

无权访问该接口

系统错误

4.3. 签名规范

为了确保数据传输过程中的数据真实性和完整性,支付宝和商户都需要对request/response数据进行签名验证。目前本接口支持的签名算法为MD5、RSA。

4.3.1. 签名注意事项

a . 没有值的参数无需传递,也无需包含到待签名数据中。

b. 签名时将字符转变成字节流时指定的字符集要与_input_charset保持一致。

c. 如果传递了_input_charset参数,那么这个参数也应该包含在待签名数据中。

d. 根据HTTP协议要求,传递参数的值中如果存在特殊字符(如:&、@等),那么该值需要做URL

Encoding,这样请求接受方才能接受到正确的参数值。这种情况下,做签名时使用的应该是原生值而不是encoding后的值。例如:待签名数据是

email=test@&partner=2000&service=test,而不是email=test%&partner=2000&service=test

4.3.2. 用于生成sign的待签名数据构造规则

HTTP传递的所有参数(除sign以外)按照参数名称字符升序的顺序串联起来(如:p1=v1&p2=v2&p3=v3),构成待签名数据。按照sec_id指定的算法对待签名数据进行签名。

例如:调用某接口需要以下参数:

service=cae_charge_agent

partner=2000

email=test@

那么待签名数据就是:email=test@&partner=2000&service=

cae_charge_agent。

4.3.3. 支付宝系统通知待签名数据构造规则

支付宝系统通知待签名数据构造规则比较特殊,为固定顺序。

商户收到如下请求:

/servlet/NotifyReceiver?service=&sign=Rw/y4ROnNicXhaj287Fiw5pvP6viSyg53H3iNiJ61D3YVi7zGniG2680pZv6rakMCeXX++q9XRLw8Rj6I1//qHrwMAHS1hViNW6hQYsh2TqemuL/xjXRCY3vjm1HCoZOUa5zF2jU09yG23MsMIUx2FAWCL/rgbcQcOjLe5FugTc=&v=1.0&sec_id=0001¬ify_data=1

则只需对以下数据验签:

service=&v=1.0&sec_id=0001¬ify_data=1

4.3.4.

签名算法对比

特性 算法

MD5

×

×

×

RSA

×

实现简单

防篡改

防抵赖

加密

电子签名法是否承认

4.3.5. MD5算法签名

定义:MD5是一种摘要生成算法,本来是不能用于签名的。但是,通过在待签名数据之后加上一串私密内容(指令发送、接收双方事先规定好的,这里我们称其为签名密钥),就可以用于签名了。使用这种算法签名只能起到防数据篡改的功能,不能起到签名防抵赖的功能,因为双方都知道签名密钥

 登录 无线商户签约平台 获取

我的产品>>密钥管理 >>安全校验码(MD5)。

 生成sign 值JAVA 示例:content =待签名数据+安全校验码(MD5); String sign =

5Hex(es("utf-8"));

 验签时商户只需用response中的参数签名后和sign值比较,一致说明验签成功。

4.3.6. RSA算法签名

定义:RSA是一种非对称的签名算法,即签名密钥(私钥)与验签名密钥(公钥)是不一样的,私钥用于签名,公钥用于验签名。使用这种算法签名在起到防数据篡改功能的同时,还可以起到防抵赖的作用,因为私钥只有签名者知道。

 用集成文档压缩包中openssl 工具生成一套RSA公私钥。登录 无线商户签约平台,把公钥用txt文件上传至我的产品>>密钥管理>>安全校验码(RSA)>>商户公钥 。并获取 安全校验码(RSA)>>支付宝公钥

RSA密钥生成命令:

生成RSA私钥

openssl genrsa -out rsa_private_ 1024

生成RSA公钥

openssl rsa -in rsa_private_ -pubout -out rsa_public_

将RSA私钥转换成PKCS8格式

openssl pkcs8 -topk8 -inform PEM -in rsa_private_ -outform PEM -nocrypt

 生成sign值的示例代码(非真实代码仅供参考):

content: 按4.3.2生成。 privateKey: openssl生成的私钥。

public String sign(String content, String privateKey) throws Exception {

tory keyFactory =

tance("RSA");

byte[] encodedKey = xt(new ByteArrayInputStream(

es())).getBytes();

// 先base64解码

encodedKey = Base64(encodedKey);

eKey prikey = tePrivate(new

8EncodedKeySpec(encodedKey));

ure signature =

tance("SHA1WithRSA");

gn(prikey);

(es("utf-8"));

byte[] signBytes = ();

String sign = new String(Base64(signBytes));

return sign;

}

 验签JAVA示例代码(非真实代码仅供参考):

content: 按4.3.2 或 4.3.3 生成。

sign : 支付宝返回给商户的sign值。

publicKey :登录无线商户签约平台获取

安全校验码(RSA)>>支付宝公钥

public boolean verify(String content, String sign, String publicKey) throws

Exception {

tory keyFactory =

tance("RSA");

StringWriter writer = new StringWriter();

(new InputStreamReader(new ByteArrayInputStream(publicKey

.getBytes())), writer);

byte[] encodedKey = ng().getBytes();

// 先base64解码

encodedKey = Base64(encodedKey);

Key pubKey = tePublic(new

.X509EncodedKeySpec(encodedKey));

byte[] signed = Base64(es());

ure signature =

tance("SHA1WithRSA");

rify(pubKey);

(es("utf-8"));

boolean verify = (signed);

return verify;

}

发布评论

评论列表 (0)

  1. 暂无评论