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)
样例
-
-
nnel
2547
test@
MD5
70e79c04e17fa1c18786ecf4533ce9a2
-
-
3.1.1.3. 失败返回样例(response)
样例
验签内容是 result=
验签使用的编码字符集要用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=
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=
3.1.2.3. 失败返回样例(response)
失败返回无论哪种签名方式,内容都是明文无需解密。
样例
partner=279&req_id=46&res_error=0005
3.1.3 授权并执行(dExecute)
该接口由支付宝提供给商户调用。
3.1.3.1 请求样例(request)
Get形式请求。
以下样例分为三类参数(下划线参数为最外层参数,共8个。只有req_data参数值中包含内层xml标签参数。):
蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)
红色参数---- 表示该参数非必传。(详见参数列表)
绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)
样例(如用GET方式请求需要URL Encode):
/service/?req_data=
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= de_no>2835
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"?>
请求参数格式 接口版本号 String String String Y Y Y format v req_data 请求业务参数 String 参数值内容为xml格式,包含内层标签参数 Y total_fee>50 固定标签 String req_data参数值xml内容中必须包含的固定标签。 Y seller_account_name>tbbusi003@ 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= 则只需对以下数据验签: service=&v=1.0&sec_id=0001¬ify_data= 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)
样例
-
-
nnel
2547
test@
MD5
70e79c04e17fa1c18786ecf4533ce9a2
-
-
3.1.1.3. 失败返回样例(response)
样例
验签内容是 result=
验签使用的编码字符集要用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=
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=
3.1.2.3. 失败返回样例(response)
失败返回无论哪种签名方式,内容都是明文无需解密。
样例
partner=279&req_id=46&res_error=0005
3.1.3 授权并执行(dExecute)
该接口由支付宝提供给商户调用。
3.1.3.1 请求样例(request)
Get形式请求。
以下样例分为三类参数(下划线参数为最外层参数,共8个。只有req_data参数值中包含内层xml标签参数。):
蓝色参数---- 表示该参数为必传,值可自定义。(详见参数列表)
红色参数---- 表示该参数非必传。(详见参数列表)
绿色参数---- 表示该参数为必传,并且参数值须和示例一致。(详见参数列表)
样例(如用GET方式请求需要URL Encode):
/service/?req_data=
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= de_no>2835
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"?>
请求参数格式 接口版本号 String String String Y Y Y format v req_data 请求业务参数 String 参数值内容为xml格式,包含内层标签参数 Y total_fee>50 固定标签 String req_data参数值xml内容中必须包含的固定标签。 Y seller_account_name>tbbusi003@ 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= 则只需对以下数据验签: service=&v=1.0&sec_id=0001¬ify_data= 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; }