## 1 my.paySignCenter(Object object)
**支付宝客户端** 10.0.18 或更高版本; 若版本较低,建议采取 [兼容处理](https://ideservice.alipay.com/cms/site/038x6t) 。
**支小宝客户端 **支持
**安诊儿客户端 **支持
**小程序开发者工具:** 不支持。
**主体:** 企业支付宝小程序
# 2 简介
唤起周期扣款签约页面。
有关周期扣款的签约流程、使用场景、服务端请求参数等信息,请查阅 [周期扣款产品说明](https://ideservice.alipay.com/cms/site/00a059)。
## 2.1 效果示例
周期扣款签约页面效果示例
默认标题0

默认标题1

# 3 接入流程
## 3.1 周期扣款签约流程
为了确保准确接入**“周期扣款签约流程”**的能力, 需要按照 开发设置 > 绑定商家账号 > 开通产品 > 获取 signStr > **API调用** > 获取签约结果 的流程接入。
### 开发设置(开放平台)
**是否必须:** 是。
使用 **主账号** 登录 [开放平台](https://open.alipay.com/develop/manage) ,选择当前开发的小程序,根据下面的说明进行相关开发配置:
- 接口加签方式:必填
- 应用网关:必填
- 支付宝网关:必填
- 接口内容加密方式:选填,建议配置
- 服务器IP白名单:选填,涉及到敏感操作时建议配置
具体可参考文档 [开发设置](https://ideservice.alipay.com/cms/site/00a05a)。
### 绑定商家账号(商家平台)
**是否必须:** 是。
在支付宝开放平台创建的应用归属于对应的开放平台账号。如果要在应用中使用支付和资金等相关产品,需要将应用和支付宝商家平台账号绑定,应用才可调用需要商家开通的产品,具体步骤可查看 [绑定应用](https://ideservice.alipay.com/cms/site/0128wr)。
### 开通产品(商家平台)
**是否必须:** 是。
在 [商家平台——产品中心](https://b.alipay.com/page/product-workspace/all-product) 列表中搜索并为当前小程序开通 **周期扣款** 产品。
### 获取 signStr(服务端)
**是否必须:** 是。
集成并配置服务端 SDK,通过 SDK 调用服务端接口 [支付宝个人协议页面签约接口(alipay.user.agreement.page.sign)](https://ideservice.alipay.com/cms/site/0j01kk) 获取 signStr。
1. 下载对应语言版本的最新版 [服务端 SDK](https://ideservice.alipay.com/cms/site/02n6z6) 并引入开发工程,用于后续的服务端接口调用。
2. 在 SDK 调用具体的接口前需要进行 AlipayClient 对象初始化。AlipayClient 对象只需要初始化一次,后续调用不同的接口都可以使用同一个 alipayClient 对象。具体可参考文档 [接口调用配置](https://ideservice.alipay.com/cms/site/00a05a)。
3. 通过服务端调用 [alipay.user.agreement.page.sign](https://ideservice.alipay.com/cms/site/0j01kk) 获取 signStr,具体可参考文档 [创建签约协议内容](https://ideservice.alipay.com/cms/site/00a05b)。
**注意:**
- 调用 alipay.user.agreement.page.sign 生成用于 my.paySignCenter 的 signStr 时,无需传入 return_url(传入也会被忽略);若开发者希望在签约成功后跳转到其他页面,请在 my.paySignCenter 的 success 回调中进行。
- 需要对 alipay.user.agreement.page.sign 接口返回的内容进行 URL encode,才能得到适用于 my.paySignCenter 的 signStr。
### API调用(小程序)
**是否必须:** 是。
在小程序中调用 API,传入参数 signStr 唤起周期扣款签约页面。
### 获取签约结果(小程序)
**是否必须:** 是。
根据 my.paySignCenter 的 success 回调的结果进行进一步处理。回调参数结构可参考 success 参数,字段含义参考 success 回调函数说明。
# 4 入参
## 4.1 Object object
查看示例
| **属性** | **类型** | **默认值** | **必填** | **描述** |
| --- | --- | --- | --- | --- |
| signStr | String | - | 是 | 签约字符串,可查看 [周期扣款接入指南](https://ideservice.alipay.com/cms/site/00a05b) 来获取该字符串 |
| success | Function | - | 否 | 调用成功的回调函数 |
| fail | Function | - | 否 | 调用失败的回调函数 |
| complete | Function | - | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
## 4.2 success 回调函数
### 4.2.1 参数
#### Object res
查看示例
| | **属性** | **类型** | **描述** |
| --- | --- | --- | --- |
| | result | String | 签约结果(如需该字段内部参数,切记先 `JSON.parse` 一下)`JSON.parse` 后的对象结构如下:
`sign`,类型 `string`,签名
`sign_type`,类型 `string`,签名算法类型
`alipay_user_agreement_page_sign_response`,类型 `object` |
| | resultStatus | String | 签约结果码 |
| | | | |
| **枚举值** | **描述** | **兼容性** | |
| 7000 | 协议签约成功 | - | |
| 7001 | 签约结果未知(有可能已经签约成功)。
**解决方案:**可通过服务端调用 alipay.user.agreement.query 查询签约状态,具体可参考文档 [周期扣款协议查询](https://ideservice.alipay.com/cms/site/041bxs) | - | |
| 7002 | 协议签约失败。
**解决方案:**
- 请检查小程序是否开通了对应的产品,
- 请检查调用 [alipay.user.agreement.page.sign](https://ideservice.alipay.com/cms/site/0j01kk)(支付宝个人协议页面签约接口)时的参数是否正确。常见排查思路:
- 检查 product_code 和 personal_product_code 这两个参数是否传了正确的值,是否传反,传值是否符合[文档要求](https://ideservice.alipay.com/cms/site/0j01kk)。
- 检查扣款金额是否符合周期扣款额度限制,对每个用户的单笔扣款不超过 100 元,当日扣款不超过 1000 元,当月扣款不超过 30000 元,扣款周期最短为 7 天(最长没有限制)。
| - | |
| 6001 | 用户中途取消 | - | |
| 6002 | 网络连接错误。
**解决方案:**检查网络连接后重试 | - | |
# 5 代码示例
## my.paySignCenter(Object object)
```
my.paySignCenter({
signStr: 'alipay_sdk%3Dalipay-sdk-java-dynamicVersionNo%26app_id%3D2019072465924554%26biz_content%3D%257B%2522sign_validity_period%2522%253A%25222m%2522%252C%2522product_code%2522%253A%2522CYCLE_PAY_AUTH%2522%252C%2522external_logon_id%2522%253A%252213852852877%2522%252C%2522personal_product_code%2522%253A%2522CYCLE_PAY_AUTH_P%2522%252C%2522sign_scene%2522%253A%2522INDUSTRY%257CCARRENTAL%2522%252C%2522external_agreement_no%2522%253A%2522test%2522%252C%2522third_party_type%2522%253A%2522PARTNER%2522%252C%2522prod_params%2522%253A%257B%2522auth_biz_params%2522%253A%2522%257B%255C%2522platform%255C%2522%253A%255C%2522taobao%255C%2522%257D%2522%257D%252C%2522promo_params%2522%253A%2522%257B%255C%2522key%255C%2522%253A%255C%2522value%255C%2522%257D%2522%252C%2522access_params%2522%253A%257B%2522channel%2522%253A%2522ALIPAYAPP%2522%257D%252C%2522merchant_process_url%2522%253A%2522https%253A%252F%252Fwww.merchantpage.com%252Findex%253FprocessId%253D2345678%2522%252C%2522identity_params%2522%253A%257B%2522user_name%2522%253A%2522%25E5%25BC%25A0%25E4%25B8%2589%2522%252C%2522cert_no%2522%253A%252261102619921108888%2522%252C%2522identity_hash%2522%253A%25228D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92%2522%252C%2522sign_user_id%2522%253A%25222088202888530893%2522%257D%252C%2522agreement_effect_type%2522%253A%2522DIRECT%2522%252C%2522user_age_range%2522%253A%2522%257B%255C%2522min%255C%2522%253A%255C%252218%255C%2522%252C%255C%2522max%255C%2522%253A%255C%252230%255C%2522%257D%2522%252C%2522period_rule_params%2522%253A%257B%2522period_type%2522%253A%2522DAY%2522%252C%2522period%2522%253A9%252C%2522execute_time%2522%253A%25222022-05-23%2522%252C%2522single_amount%2522%253A10.99%252C%2522total_amount%2522%253A600%252C%2522total_payments%2522%253A12%257D%257D%26charset%3DUTF-8%26format%3Djson%26method%3Dalipay.user.agreement.page.sign%26sign%3Di8X5tQSVx%252Bj8UviKuGDz5Wc8lPf%252BBtOTzlEN2N60%252FFQp%252Fgk4pubIhMzq8duIyapCVJR74lE3GFIUHrTrvcMnaTFCyLp5gRWRQFWxxunAFEMvtSLA2HUbz7tnbg49o2aMHzpYLWgEtBDSR1yl8nLSNefm4iJ46evEFX4pNC%252FdXhW3PVWaOx6d8jIjEvTkaWBpYBG%252F%252BrFmS08xfMqR58hsWDAp7x7y7emgjEfVMmTQmKhLBY8BSfXrv%252BMX%252FwD5joOToloHpKVfhjeuHcpcmyPhLjX7SPpw9xaNnmEJa9ACrXhWk440Y9XT8XiB%252F68fRfPC%252FcU14kEiob5UK5AMwYnj3Q%253D%253D%26sign_type%3DRSA2%26timestamp%3D2022-04-22%2B11%253A04%253A20%26version%3D1.0',
success: function(res) {
console.log(res);
},
fail: function(err) {
console.log(err);
}
});
```
## success 参数
```
{
"result": "{\"alipay_user_agreement_page_sign_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"app_id\":\"2017060101317939\",\"auth_app_id\":\"2017060101317939\",\"charset\":\"UTF-8\",\"timestamp\":\"2017-06-27 11:40:15\",\"sign_scene\":\"INDUSTRY|CARRENTAL\",\"valid_time\":\"2017-06-27 11:40:13\",\"status\":\"NORMAL\",\"external_agreement_no\":\"test212\",\"agreement_no\":\"20170627457298962889\",\"external_logon_id\":\"13852852877\",\"alipay_logon_id\":\"138****2877\",\"invalid_time\":\"2017-08-27 11:40:13\",\"personal_product_code\":\"GENERAL_WITHHOLDING_P\",\"sign_time\":\"2017-06-27 11:40:14\",},\"sign\": \"KgeHoSYPuhpzhfrjeuwWbRmjJtlUp+5UGfq2OxYLraWEOqKsw9FokUnodMEgKgJK8=\",\"sign_type\":\"RSA\"}",
"resultStatus": "7000"
}
```
# 6 Bugs & Tips
- Tip不支持在 IoT 小程序中使用。
- Tip关于周期扣款的常见问题可点击 [周期扣款常见问题](https://ideservice.alipay.com/cms/site/00a05d) 查看。
# 7 常见问题
## 7.1 Q:如何获取签约字符串?
A:
调用 [alipay.user.agreement.page.sign](https://ideservice.alipay.com/cms/site/0j01kk)(支付宝个人协议页面签约接口)传入周期扣款约定等相关信息创建签约协议内容,将返回内容进行一次 url encode 后做为 signStr 的值传入 my.paySignCenter。示例以及详细信息可查看 [创建签约协议内容](https://ideservice.alipay.com/cms/site/00a05b)。
## 7.2 Q:唤起的开通界面显示“无效签名”,如何处理?
A:
请检查传入的 signStr 是否正确。请对照以下内容进行自查:
传入的 signStr 需要形如:`alipay_sdk%3Dalipay-sdk-java-dynamicVersionNo%26app_id%3D2019072465924554%26biz_content%3D...`。如果是使用 SDK 获取的 signStr,得到的是这样的字符串:`alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2019072465924554&biz_content=...` ,需要先将这段字符串进行一次 urlencode。使用 Java SDK 示例代码如下:
```
AlipayUserAgreementPageSignResponse response = alipayClient.sdkExecute(request);
String signStr = URLEncoder.encode(response.getBody(), "UTF-8");
```
## 7.3 Q:开通失败常见原因有哪些?回调提示报错 7002 如何处理?
A:
可能是小程序未开通 **周期扣款** 产品,亦可能是 alipay.user.agreement.page.sign 传参问题,请参考错误码 7002 的解决方案。