mapi网关接口
更新时间:2016/04/19 访问次数:9873
接口请求网关为:https://mapi.alipay.com/gateway.do,入参包含partner、service等参数,支持MD5和RSA两种签名方式的接口,我们称之为1.0接口,这类接口目前包含:即时到账、移动快捷支付、手机网站支付、批量付款、快捷登录等。
1.查看PID、key和密钥设置
登录开放平台,点击账号,可进入账户信息页面,再点击左侧“合作伙伴密钥”;或登录b.alipay.com到签约管理或商家服务中点击“查询PID、Key”,可见到以下页面:
2.公私钥生成以及格式说明
2.1.支付宝公钥
对于支付宝公钥,看到的是一个字符串,如下:
1 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB |
如果需要使用文件方式(如使用服务端SDK的PHP/.NET版本)读取支付宝公钥,需要在头尾加入标示后保存至文件,文件内容如下:
1 2 3 | -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB -----END PUBLIC KEY----- |
2.2.开发者公钥(合作伙伴管理-查看开发者公钥)
1.0接口也支持RSA签名,开发者可先生成公私钥,然后将公钥上传给支付宝,有两处上传入口,与“1.查看PID、key和密钥设置”入口一致,均在“查看开发者公钥”中上传。
设置方法如下:
如果是第一次上传,点击“设置应用公钥”按钮。密钥生成方法参见“2.3.公私钥生成以及公钥设置步骤”。
如果不是第一次上传,同一个位置点击“查看应用公钥”按钮可查看之前上传的公钥,并可以在详情中修改公钥。
2.3.公私钥生成以及公钥设置步骤
首先生成公私钥,然后将生成的公钥上传到应用公钥,步骤如下:
2.3.1.OpenSSL工具安装
Linux用户(以Ubuntu为例)
sudo apt-get install opensslWindows用户
开发者可以在OpenSSL官方网站下载Windows的OpenSSL安装包进行安装。
2.3.2.RSA私钥及公钥生成
Linux用户(以Ubuntu为例)
$ openssl
进入OpenSSL程序OpenSSL> genrsa -out rsa_private_key.pem 1024
生成私钥OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
Java开发者需要将私钥转换成PKCS8格式OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成公钥OpenSSL> exit ##
退出OpenSSL程序Windows用户在cmd窗口中进行以下操作:
C:\Users\Hammer>cd C:\OpenSSL-Win32\bin
进入OpenSSL安装目录C:\OpenSSL-Win32\bin>openssl.exe
进入OpenSSL程序OpenSSL> genrsa -out rsa_private_key.pem 1024
生成私钥OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
Java开发者需要将私钥转换成PKCS8格式OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成公钥OpenSSL> exit ##
退出OpenSSL程序
注意:对于使用Java的开发者,将pkcs8在console中输出的私钥去除头尾、换行和空格,作为开发者私钥,对于.NET和PHP的开发者来说,无需进行pkcs8命令行操作。
经过以上步骤,开发者可以在当前文件夹中(Windows用户在C:\OpenSSL-Win32\bin)看到rsa_private_key.pem和rsa_public_key.pem两个文件,前者为私钥,后者为公钥。开发者将私钥保留,将公钥提交给支付宝网关,用于信息加密及解密。以下为使用OpenSSL生成的私钥文件和公钥文件示例。
标准的私钥文件示例(PHP、.NET使用)
123-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+L0rfjLl3neHleNMOsYTW8r0QXZ5RVb2p/vvY3fJNNugvJ7lo4+fdBz+LN4mDxTz4MTOhi5e2yeAqx+v3nKpNmPzC5LmDjhHZURhwbqFtIpZD51mOfno2c3MDwlrsVi6mTypbNu4uaQzw/TOpwufSLWF7k6p2pLoVmmqJzQiD0QIDAQABAoGAakB1risquv9D4zX7hCv9MTFwGyKSfpJOYhkIjwKAik7wrNeeqFEbisqv35FpjGq3Q1oJpGkem4pxaLVEyZOHONefZ9MGVChT/MNH5b0FJYWl392RZy8KCdq376Vt4gKVlABvaV1DkapL+nLh7LMo/bENudARsxD55IGObMU19lkCQQDwHmzWPMHfc3kdY6AqiLrOss+MVIAhQqZOHhDe0aW2gZtwiWeYK1wB/fRxJ5esk1sScOWgzvCN/oGJLhU3kipHAkEAysNoSdG2oWADxlIt4W9kUiiiqNgimHGMHPwp4JMxupHMTm7D9XtGUIiDijZxunHv3kvktNfWj3Yji0661zHVJwJBAM8TDf077F4NsVc9AXVs8N0sq3xzqwQD/HPFzfq6hdR8tVY5yRMb4X7+SX4EDPORKKsgnYcur5lk8MUi7r072iUCQQC8xQvUne+fcdpRyrR4StJlQvucogwjTKMbYRBDygXkIlTJOIorgudFlrKP/HwJDoY4uQNl8gQJb/1LdrKwIe7FAkBl0TNtfodGrDXBHwBgtN/t3pyi+sz7OpJdUklKE7zMSBuLd1E3O4JMzvWP9wEE7JDb+brjgK4/cxxUHUTkk592
-----END RSA PRIVATE KEY-----
PKCS8处理后的私钥文件示例(Java使用)
123-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN0yqPkLXlnhM+2H/57aHsYHaHXazr9pFQun907TMvmbR04wHChVsKVgGUF1hC0FN9hfeYT5v2SXg1WJSg2tSgk7F29SpsF0I36oSLCIszxdu7ClO7c22mxEVuCjmYpJdqb6XweAZzv4Is661jXP4PdrCTHRdVTU5zR9xUByiLSVAgMBAAECgYEAhznORRonHylm9oKaygEsqQGkYdBXbnsOS6busLi6xA+iovEUdbAVIrTCG9t854z2HAgaISoRUKyztJoOtJfI1wJaQU+XL+U3JIh4jmNx/k5UzJijfvfpT7Cv3ueMtqyAGBJrkLvXjiS7O5ylaCGuB0Qz711bWGkRrVoosPM3N6ECQQD8hVQUgnHEVHZYtvFqfcoq2g/onPbSqyjdrRu35a7PvgDAZx69Mr/XggGNTgT3jJn7+2XmiGkHM1fd1Ob/3uAdAkEA4D7aE3ZgXG/PQqlm3VbE/+4MvNl8xhjqOkByBOY2ZFfWKhlRziLEPSSAh16xEJ79WgY9iti+guLRAMravGrs2QJBAOmKWYeaWKNNxiIoF7/4VDgrcpkcSf3uRB44UjFSn8kLnWBUPo6WV+x1FQBdjqRviZ4NFGIP+KqrJnFHzNgJhVUCQFzCAukMDV4PLfeQJSmna8PFz2UKva8fvTutTryyEYu+PauaX5laDjyQbc4RIEMU0Q29CRX3BA8WDYg7YPGRdTkCQQCG+pjU2FB17ZLuKRlKEdtXNV6zQFTmFc1TKhlsDTtCkWs/xwkoCfZKstuV3Uc5J4BNJDkQOGm38pDRPcUDUh2/
-----END PRIVATE KEY-----
公钥文件示例
123-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
-----END PUBLIC KEY-----
2.3.3.上传公钥
将公钥文件去除头尾、换行和空格,仅需填入字符串,例如转换前公钥pem文件格式:
1 2 3 | -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB -----END PUBLIC KEY----- |
转换后得到的字符串为:
1 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB |
将字符串填入1.查看PID、key和密钥设置对应的位置,并且代码中使用公钥对应的私钥进行签名。
3.组装待签名字符串,签名
筛选
获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign与sign_type参数。排序
将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。拼接
将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。MD5签名的商户需要将key的值拼接在字符串后面,调用MD5算法生成sign;RSA签名的商户将待签名字符串和商户私钥带入SHA1算法中得出sign。
商户如用支付宝提供的demo集成,demo已写好签名验签的方法,商户可直接调用,如自己开发不用demo,则按以上方法拼接待签名字符串。 以下是待签名字符串的示例,key值已被隐藏,参数值都是示例不是真实的,商户参考格式即可:1_input_charset=utf-
8
&body=testjsdzbody¬ify_url=http:
//www.test.com/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp&out_trade_no=9890879868657&partner=2088000000000000&payment_type=1&return_url=http://www.baidu.com&seller_id=2088000000000000&service=create_direct_pay_by_user&subject=testjsdz&total_fee=0.01svzitn**********pslfal77xlxm0qhc
以下是最终的请求信息,sign值被隐藏:
1http:
//mapi.alipay.com/gateway.do?body=testjsdzbody&subject=testjsdz&sign_type=MD5¬ify_url=http://www.test.com/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp&out_trade_no=9890879868657&return_url=http://www.baidu.com&sign=***&_input_charset=utf-8&total_fee=0.01&service=create_direct_pay_by_user&partner=2088000000000000&seller_id=2088000000000000&payment_type=1
4.验证签名
筛选
获取所有支付宝返回的参数,不包括字节类型参数,如文件、字节流。验签参数剔除sign与sign_type参数。排序
将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。拼接
将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来。
例如下面的返回示例(此示例跟上面的请求示例没关系,其中的值都是示例不是真实的,商户参考格式即可):1http:
//商户自定义地址/notify_url.php?trade_no=2014040311001004370000361525&out_trade_no=3618810634349901&subject=测试&body=Hello&price=10.00&quantity=1&total_fee=10.00&trade_status=TRADE_FINISHED&seller_email=test@test.com&seller_id=2088002007018916&buyer_id=2088002000000000&buyer_email=13788888888&gmt_create=2014-04-03 20:49:31&is_total_fee_adjust=N&gmt_payment=2014-04-03 20:49:50&use_coupon=N¬ify_time=2014-04-03 20:49:52¬ify_type=trade_status_sync¬ify_id=70fec0c2730b27528665af4517c27b95&sign_type=DSA&sign=_p_w_l_h_j0b_gd_aejia7n_ko4_m%2Fu_w_jd3_nx_s_k_mxus9_hoxg_y_r_lunli_pmma29_t_q%3D%3D&extra_common_param=你好,这是测试商户的广告。
组成的待签名字符串为:
1body=Hello&buyer_email=
13788888888
&buyer_id=
2088002007013600
&extra_common_param=你好,这是测试商户的广告。&gmt_create=
2014
-
04
-
03
20
:
49
:
31
&gmt_payment=
2014
-
04
-
03
20
:
49
:
50
&is_total_fee_adjust=N¬ify_id=70fec0c2730b27528665af4517c27b95¬ify_time=
2014
-
04
-
03
20
:
49
:
52
¬ify_type=trade_status_sync&out_trade_no=
3618810634349901
&price=
10.00
&quantity=
1
&seller_email=test
@test
.com&seller_id=
2088002007018916
&subject=测试&total_fee=
10.00
&trade_no=
2014040311001004370000361525
&trade_status=TRADE_FINISHED&use_coupon=N
1.0接口demo中提供了验签的示例,商户可直接调用或参考。MD5:把MD5密钥(Key)拼接在待验证签名的字符串尾部,然后使用各自语言对应的MD5加密函数进行加密,得到的加密值与支付宝返回的参数sign做“相等”判断,同时对返回参数中的notify_id进行验证,如果这两个数据同时为true,则验证通过。
FAQ
关于此文档暂时还没有FAQ