文档中心 > 商家签约服务

商家签约服务进阶功能

更新时间:2016/12/15 访问次数:9019

入驻接口参数预校验

开发者通过接口提交入驻表单后,支付宝端会对表单中的参数进行预校验,如预校验失败会返回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);
  • 如认证审核失败则状态变为入驻申请单审核失败(MERCHANT_APPLY_ORDER_CANCELED)。
入驻申请单签约审核中(MERCHANT_SIGN_CONTRACT)

认证审核通过后,根据开发者的appid获取相关可签约产品,并进行自助签约,创建合约完成后,后台小二开始人工审核:

  • 如签约审核失败则状态变为入驻申请单审核失败(MERCHANT_APPLY_ORDER_CANCELED);
  • 如签约审核通过,对于个体工商户状态进入待商户确认自助签约结果(MERCHANT_CONFIRM);对于未认证的企业级商户会向其提交的对公账户打款,如打款成功入驻申请单状态会推进为待商户确认自助签约结果(MERCHANT_CONFIRM),如打款失败入驻申请单状态会推进为入驻申请单审核失败(MERCHANT_APPLY_ORDER_CANCELED)。
入驻申请单审核失败(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_info)

参数名

参数说明

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"
            }
        ]
    }
}

说明:

  • 支付宝端入驻申请单据号为20160720000000000000000000011052的单据,认证失败、产品签约一个失败一个成功;
  • 认证审核状态为“MERCHANT_APPlY_FAIL”,认证失败原因为“已存在用户主体不相同”,相关入参为“login_id”;
  • 产品名称为“当面付”,签约状态为“PASSED”;
  • 产品名称为“当面付”,签约状态为“REJECTED”,失败原因为“同批次合约冲突”;
  • 认证审核批注为“图片模糊”。

各类型的审核详情示例:

1. 认证审核详情

{
    "result_msg": "姓名与身份证上不符",
    "result_status": "MERCHANT_APPlY_FAIL",
    "result_type": "CERTIFY",
    "prop_input_key": "operator_name"
}

说明:

  • 详情类型:认证(CERTIFY)
  • 认证状态:认证失败(MERCHANT_APPlY_FAIL)
  • 失败原因:姓名与身份证上不符
  • 相关入参:operator_name
  • 解决方式:修改operator_name后重新提交 

2. 认证审核批注

{
    "result_msg": "证件图片模糊",
    "result_type": "COMMENT"
}

说明:

  • 详情类型:认证审核批注(COMMENT)
  • 批注内容:证件图片模糊 

3. 产品签约审核成功详情

{
    "prod_name": "当面付",
    "result_status": "PASSED",
    "result_type": "PROD"
}

说明:

  • 详情类型:产品签约(PROD)
  • 产品名称:当面付
  • 签约状态:通过(PASSED) 

4. 产品签约审核失败详情

{
    "prod_name": "当面付",
    "result_msg": "店铺内景照片未上传",
    "result_status": "REJECTED",
    "result_type": "PROD",
    "prop_input_key": "shop_scene_pic"
}

说明:

  • 详情类型:产品签约(PROD)
  • 产品名称:当面付
  • 签约状态:驳回(REJECTED)
  • 失败原因:店铺内景照片未上传
  • 相关入参: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(触发通知)

服务器异步通知页面特性

  1. 必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等;
  2. 支付宝是用POST方式发送通知信息,因此该页面中获取参数的方式,如:Form(“out_biz_no”)、$_POST[‘out_biz_no’];
  3. 支付宝主动发起通知,该方式才会被启用;
  4. 只有在支付宝的入驻申请单管理中存在该笔单据,且发生了单据状态的改变,支付宝才会通过该方式发起服务器通知;
  5. 服务器间的交互,不像页面跳转同步通知可以在页面上显示出来,这种交互方式是不可见的;
  6. 程序执行完后必须打印输出“success”(不包含引号)。如果开发者反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
  7. 程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到success字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知;
  8. cookies、session等在此页面会失效,即无法获取这些数据;
  9. 该方式的调试与运行必须在服务器上,即互联网上能访问;
  10. 该方式的作用主要防止订单丢失,即页面跳转同步通知没有处理订单更新,它则去处理;
  11. 当开发者收到服务器异步通知并打印出success时,服务器异步通知参数notify_id才会失效。也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出success导致支付宝重发数次通知),服务器异步通知参数notify_id是不变的。

验证是否支付宝请求

验证此次通知信息是否是支付宝服务器发来的信息,以帮助校验反馈回来的数据的真假性。
获取支付宝返回数据之一的通知校验ID(notify_id),按照支付宝要求的格式拼接成要请求的链接,如:

https://mapi.alipay.com/gateway.do?service=notify_verify&partner=2088002396712354&notify_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=&notify_time=2016-07-22+01:15:11&order_detail=[]&sign_type=RSA&charset=GBK&app_id=2016071201167005&notify_type=isv_settling_result_notify&notify_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&notify_type=isv_settling_result_notify&notify_id=1bda62a50ac40137f0c2702426a8029je8&order_status=MERCHANT_CONFRIM_SUCCESS&order_no=20160720000000000000000000009480&version=1.0&out_biz_no=20160720000000000000000000009480

第三步:将签名参数(sign)使用base64解码为字节码串。

第四步:使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。

开发业务处理注意事项

开发必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有单据通知状态为MERCHANT_CONFIRM_SUCCESS时,支付宝才会认定为入驻申请认证签约完成且商户确认完成。如果开发者未正确处理业务通知,存在潜在的风险,开发者自行承担因此而产生的所有损失。

FAQ

关于此文档暂时还没有FAQ
返回
顶部