开发者通过接口提交入驻表单后,支付宝端会对表单中的参数进行预校验,如预校验失败会返回INVALID_PARAMETER错误码,并在sub_msg中标明什么字段发生了什么问题,每个参数的报错信息用”;”分隔。样例如下:
{ "ant_merchant_expand_personal_apply_response": { "code": "40004", "msg": "Business Failed", "sub_code": "INVALID_PARAMETER", "sub_msg": "参数有误。经营者姓名不可为空;经营者证件号码不可为空" } }
说明:
开发者提交个体工商户入驻申请单后参数预校验失败:
1、经营者姓名不可为空
2、经营者证件号码不可为空
预校验规则:
1、根据API列表中标注的是否可空、字段长度等维度进行参数校验。
2、企业级商户login_id只能是邮箱,个体工商户login_id只能是邮箱和手机号码。
3、图片相关参数必须是通过专用图片上传接口返回的image_id。
4、个体工商户传入的银行卡账号会根据银行卡号规则校验。
5、企业级商户传入的对公账户支行信息必须完整。
6、传入的企业mcc编码必须符合规范。
7、如传入的mcc编码属于特定行业,需上传特殊资质图片。
8、对于不同的签约产品,需要的特殊入参要求请见商家签约需要提供的资料。
开发者提交入驻申请单后,整体入驻流程由下图的几个部分组成。开发者需要关注入驻申请单审核失败(MERCHANT_APPLY_ORDER_CANCELED)、待商户确认自助签约结果(MERCHANT_CONFIRM)、商户确认超时(MERCHANT_CONFIRM_TIME_OUT)、商户确认成功(MERCHANT_CONFIRM_SUCCESS)等四种状态。下文将详细介绍入驻申请的几种状态。
状态 | 说明 |
入驻申请单已提交(MERCHANT_REGISTER) | 开发者通过接口(企业级商户入驻申请接口&个体工商户入驻申请接口)提交入驻表单后,如果通过参数预校验,支付宝端会将入驻申请单的状态置为入驻申请单已提交(MERCHANT_REGISTER),并触发认证人工审核流程。 |
入驻申请单认证审核中(MERCHANT_CERTIFY) | 后台小二开始审核该笔单据的认证信息:
|
入驻申请单签约审核中(MERCHANT_SIGN_CONTRACT) | 认证审核通过后,根据开发者的appid获取相关可签约产品,并进行自助签约,创建合约完成后,后台小二开始人工审核:
|
入驻申请单审核失败(MERCHANT_APPLY_ORDER_CANCELED) | 如认证审核和签约审核未通过,则入驻申请单变为该状态并通过异步通知的方式告知开发者审核失败及审核失败的原因。该笔入驻申请单达到失败的终态。开发者根据异步通知的结果,修改入驻申请单据的内容并更新外部入驻单据号后可重新提交申请单。 |
待商户确认自助签约结果(MERCHANT_CONFIRM) | 认证审核、签约审核全部通过后,入驻申请单状态变为待商户确认自助签约结果(MERCHANT_CONFIRM)并以异步通知的方式告知开发者该笔单据的状态并以短信、邮件的形式通知商户(入驻申请中的联系人信息)并等待商户确认。 |
商户确认超时(MERCHANT_CONFIRM_TIME_OUT) | 从支付宝端发送确认通知开始计算时间,如超过7天商户还未进行确认,入驻申请单的状态会变为商户确认超时(MERCHANT_CONFIRM_TIME_OUT)并以异步通知的方式告知开发者该笔单据已确认超时。该笔入驻申请单达到失败的终态。开发者可修改外部入驻申请单据号后重新提交。 |
商户确认成功(MERCHANT_CONFIRM_SUCCESS) | 商户通过支付宝端发送的确认通知中的url地址进行协议确认,入驻申请单的状态会变为商户确认成功(MERCHANT_CONFIRM_SUCCESS)并以异步通知的方式告知开发者该笔单据的已确认成功。该笔入驻申请单达到成功的终态。整体流程结束。 |
开发者可根据order_no(支付宝端入驻申请单据号)通过查询接口(ant.merchant.expand.mapplyorder.query)来查询该笔单据的详细状态,查询结果包含入驻申请单基础信息及认证、签约审核详情如下图:
参数名 |
参数说明 |
order_no |
支付宝端入驻申请单据号 |
order_status |
支付宝端入驻申请单状态 |
out_biz_no |
外部入驻申请单据号 |
result_info |
入驻申请单认证审核、签约审核详情。 |
在返回结果中,result_info作为入驻申请单认证审核、签约审核的详细信息,只有在入驻申请单状态为MERCHANT_APPLY_ORDER_CANCELED 、MERCHANT_CONFIRM、MERCHANT_CONFIRM_TIME_OUT、MERCHANT_CONFIRM_SUCCESS四种单据终态的时候才会返回。
参数名 |
参数说明 |
result_type |
详情类型,包括:CERTIFY(认证),PROD(产品签约),COMMENT(认证审核批注)。 |
result_status |
审核状态。 |
result_msg |
如详情类型为COMMENT则展示批注信息,其它类型如审核未通过则该字段展示失败原因。 |
prop_input_key |
如审核失败是因为入参引起的,则展示该失败原因相关的入参名称。 |
prod_name |
如详情类型为PROD,则该字段展示签约产品的名称,其余类型该字段不展示。 |
参数名 |
参数说明 |
MERCHANT_APPlY_FAIL |
认证审核失败,通过错误详情修改相应的请求参数后重新提交。 |
MERCHANT_CERTIFY_AUDIT_PASSED |
认证审核通过 |
MERCHANT_CONFIRM_PASSED |
商户确认成功 |
参数名 |
参数说明 |
REJECTED |
签约审核驳回 |
PASSED |
签约审核通过 |
EFFECTED |
签约已生效 |
{ "ant_merchant_expand_mapplyorder_query_response": { "code": "10000", "msg": "Success", "order_no": "20160720000000000000000000011052", "order_status": "MERCHANT_APPLY_ORDER_CANCELED", "out_biz_no": "20160720102237962", "result_info": [ { "result_msg": "已存在用户主体不相同", "result_status": "MERCHANT_APPlY_FAIL", "result_type": "CERTIFY", "prop_input_key": "login_id" }, { "prod_name": "当面付", "result_status": "PASSED", "result_type": "PROD" }, { "prod_name": "当面付", "result_msg": "店铺内景照片未上传", "result_status": "REJECTED", "result_type": "PROD", "prop_input_key": "shop_scene_pic" }, { "result_msg": "图片模糊", "result_type": "COMMENT" } ] } }
说明:
1. 认证审核详情
{ "result_msg": "姓名与身份证上不符", "result_status": "MERCHANT_APPlY_FAIL", "result_type": "CERTIFY", "prop_input_key": "operator_name" }
说明:
2. 认证审核批注
{ "result_msg": "证件图片模糊", "result_type": "COMMENT" }
说明:
3. 产品签约审核成功详情
{ "prod_name": "当面付", "result_status": "PASSED", "result_type": "PROD" }
说明:
4. 产品签约审核失败详情
{ "prod_name": "当面付", "result_msg": "店铺内景照片未上传", "result_status": "REJECTED", "result_type": "PROD", "prop_input_key": "shop_scene_pic" }
说明:
入驻申请单提交成功后,如果入驻申请单状态为入驻申请单审核失败(MERCHANT_APPLY_ORDER_CANCELED)、待商户确认自助签约结果(MERCHANT_CONFIRM)、商户确认超时(MERCHANT_CONFIRM_TIME_OUT)、商户确认成功(MERCHANT_CONFIRM_SUCCESS)会通过入驻申请接口请求中传入的通知参数地址notify_url通知到开发者系统。具体的方式是向通知地址notify_url发送个POST请求,请求中包含支付结果的相关参数。
参数 |
参数名称 |
类型 |
必填 |
描述 |
范例 |
notify_time |
通知时间 |
Date |
是 |
通知的发送时间。格式为yyyy-MM-dd HH:mm:ss |
2015-14-27 15:45:58 |
notify_type |
通知类型 |
String(64) |
是 |
通知的类型 |
trade_status_sync |
notify_id |
通知校验ID |
String(128) |
是 |
通知校验ID |
ac05099524730693a8b330c5ecf72da9786 |
sign_type |
签名类型 |
String(10) |
是 |
签名算法类型,目前支持RSA |
RSA |
sign |
签名 |
String(256) |
是 |
请参考异步返回结果的验签 |
601510b7970e52cc63db0f44997cf70e |
order_no |
支付宝入驻申请单据号 |
String(64) |
是 |
支付宝端商户入驻申请单据号 |
2013112011001004330000121536 |
app_id |
开发者的app_id |
String(32) |
是 |
支付宝分配给开发者的应用Id |
2014072300007148 |
out_biz_no |
外部入驻申请单据号 |
String(64) |
是 |
外部入驻申请单据号 |
6823789339978248 |
order_status |
支付宝商户入驻申请单状态
|
String(64) |
是 |
支付宝商户入驻申请单状态,详见入驻申请状态流转介绍 |
MERCHANT_CONFIRM |
order_detail |
入驻申请单认证审核、签约审核详情 |
- |
否 |
入驻申请单认证审核、签约审核详情,详见入驻申请单查询接口返回结果 |
触发条件名 |
触发条件描述 |
触发条件默认值 |
MERCHANT_CONFIRM_SUCCESS |
认证、签约成功 |
true(触发通知) |
MERCHANT_CANCEL_APPLY_ORDER |
认证失败或签约失败 |
true(触发通知) |
MERCHANT_CONFIRM |
认证、签约审核通过待商户确认 |
true(触发通知) |
MERCHANT_CONFIRM_TIME_OUT |
商户确认超时 |
true(触发通知) |
验证此次通知信息是否是支付宝服务器发来的信息,以帮助校验反馈回来的数据的真假性。
获取支付宝返回数据之一的通知校验ID(notify_id),按照支付宝要求的格式拼接成要请求的链接,如:
https://mapi.alipay.com/gateway.do?service=notify_verify&partner=2088002396712354¬ify_id=RqPnCoPT3K9%252Fvwbh3I%252BFioE227%252BPfNMl8jwyZqMIiXQWxhOCmQ5MQO%252FWd93rvCB%252BaiGg
通过访问这个请求链接,利用编程方法来模拟http请求与支付宝服务器进行交互,获得支付宝服务器上处理的结果。
如果获得的信息是true,则校验成功;如果获得的信息是其他,则校验失败。
异步通知的验签方式和同步返回略有不同。以一个具体异步通知的返回为例:
http://api.test.alipay.net/atinterface/receive_notify.htm?sign=MW/hbd8FKv1VNdG3SSBO86PZj6gSMphK+EwSDF7nxnCS98JiM9Zz8vawm339RX3/3i2jIXozMLJl130373ad3YmcwaUs5VDhvdN/EbG4Ya3p5zDy6B9IKs3MToDPYlQKXu9l+kS22Jp2ufyI4GMLVXBjOCZLq4VLjrhXB/EWjHc=¬ify_time=2016-07-22+01:15:11&order_detail=[]&sign_type=RSA&charset=GBK&app_id=2016071201167005¬ify_type=isv_settling_result_notify¬ify_id=1bda62a50ac40137f0c2702426a8029je8&order_status=MERCHANT_CONFRIM_SUCCESS&order_no=20160720000000000000000000009480&version=1.0&out_biz_no=20160720000000000000000000009480
第一步:在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。
第二步:将剩下参数进行url_decode,然后进行字典排序,组成字符串,得到待签名字符串:
notify_time=2016-07-22+01:15:11&order_detail=[]&charset=GBK&app_id=2016071201167005¬ify_type=isv_settling_result_notify¬ify_id=1bda62a50ac40137f0c2702426a8029je8&order_status=MERCHANT_CONFRIM_SUCCESS&order_no=20160720000000000000000000009480&version=1.0&out_biz_no=20160720000000000000000000009480
第三步:将签名参数(sign)使用base64解码为字节码串。
第四步:使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。
开发必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有单据通知状态为MERCHANT_CONFIRM_SUCCESS时,支付宝才会认定为入驻申请认证签约完成且商户确认完成。如果开发者未正确处理业务通知,存在潜在的风险,开发者自行承担因此而产生的所有损失。