支付宝服务商支付:如何邀请商户入驻
一、支付宝服务商支付
支付宝服务商支付模式为商户带来了诸多优势。它能够整合多种支付方式,包括扫码支付、刷脸支付、线上支付等,满足不同消费者的支付习惯。同时,提供了强大的财务管理功能,如交易流水查询、对账、报表生成等,帮助商户清晰掌握经营状况。此外,还具备丰富的营销工具,如优惠券、红包、积分等,助力商户吸引新客户、留住老客户,提升销售额。
对于服务商而言,每成功邀请一家商户入驻,都意味着能够分享商户交易产生的手续费收益。随着商户数量的增加和交易规模的扩大,服务商的收益也将水涨船高。而且,通过为商户提供优质的支付服务,服务商能够树立良好的品牌形象,拓展商业合作机会,在支付领域占据一席之地。
二、通过控制台生成授权链接/二维码
-
登录支付宝服务商控制台
首先,使用您专属的支付宝服务商账号和密码,登录到支付宝为服务商的控制台。 -
导航至商户入驻功能模块
在控制台的众多功能选项中,准确找到商户入驻相关的模块。通常,它会以醒目的图标或明确的文字标识呈现,确保您能够轻松定位。
-
填写商户详细信息
在商户入驻页面,您需要仔细填写商户的各项基本信息。这包括商户的名称、营业执照号码、法定代表人姓名、联系方式、经营范围、店铺地址等关键内容。准确而完整的信息有助于支付宝对商户进行资质审核和风险评估,加快入驻流程(商户号)。 -
一键生成授权链接/二维码
当您完成商户信息的填写并提交后,支付宝服务商会根据您提供的信息,迅速为您生成专属的授权链接或二维码。
生成的授权链接可以通过电子邮件、短信、即时通讯工具等方式直接发送给商户。商户只需点击链接,即可进入授权页面,按照提示完成操作。而二维码则更适合线下场景。
三、手动拼接授权链接邀请商户入驻
在某些特定情况下,您可能需要手动拼接授权链接来邀请商户入驻。这需要您对支付宝授权链接的参数有深入的了解。
- 单个应用授权:商家仅有一个应用需要授权。单个授权模式无法实现小程序相关接口调用,默认优先授权基础应用,若商家内没有基础应用,则系统自动生成基础应用。当商家拥有多个应用时,建议使用指定授权的方式拼接授权链接。
app_id
:这是支付宝为您的服务商应用分配的独一无二的标识符,类似于您应用的身份证号码。redirect_uri
:商户完成授权操作后,支付宝将重定向商户访问的回调地址。这个地址通常用于接收授权结果和相关数据。state
:用于保持请求和回调过程中的状态一致性,可以根据您的业务需求自定义设置,可不填。
以下是手动拼接授权链接的示例模板:
https://openauth.alipay.com/oauth2/appToAppAuth.htm?app_id={your_app_id}&redirect_uri=UrlEncode({your_redirect_uri})&state={your_state}
在实际操作中,您需要将 {your_app_id}
替换为您从支付宝获取的真实应用 ID,将 {your_redirect_uri}
替换为您预先设定的经过 URL 编码的回调地址,并根据具体业务场景合理设置 {your_state}
的值。
例如,如果您的应用 ID 是 1234567890
,回调地址是 https://yourdomain.com/callback
,自定义状态值是 merchant001
,那么拼接后的授权链接将是:
https://openauth.alipay.com/oauth2/appToAppAuth.htm?app_id=1234567890&redirect_uri=UrlEncode(https://yourdomain.com/callback)&state=merchant001
- 指定应用授权:商家有多个应用,从多个应用中选择一个。支持 全权委托授权代开发模式。
PC 端授权链接
https://b.alipay.com/page/message/tasksDetail?bizData=UrlEncode({"platformCode":"O","taskType":"INTERFACE_AUTH","agentOpParam":{"redirectUri":"{redirectUri}","appTypes":{appTypes},"isvAppId":"{isvAppId}","state":"{state}"}})
移动端二维码
alipays://platformapi/startapp?appId=2021003130652097&page=pages%2Fauthorize%2Findex%3FbizData%3DUrlEncode({"platformCode":"O","taskType":"INTERFACE_AUTH","agentOpParam":{"redirectUri":"{redirectUri}","appTypes":{appTypes},"isvAppId":"{isvAppId}","state":"{state}"}})
注意
-
指定应用授权中,商家账号下必须拥有和 application_type 指定类型对应的应用,如
application_type=MOBILEAPP
(移动应用),商家必须有移动应用,否则授权页面中没有可选择的应用。platformCode 和 taskType 是固定参数,无需修改。 -
platformCode 参数值为大写字母“O”,不是数字零。
-
参考支付宝参数
参数 | 类型 | 最大长度 | 必填参数 | 描述 | 示例 |
---|---|---|---|---|---|
isvAppId | String | 32 | 是 | 第三方应用 APPID。 | 2021000000000318 |
appTypes | String | / | 是 | 对商家应用的限制类型,数组格式,支持多选,中间使用英文逗号(,)分隔,目前支持类型: MOBILEAPP(移动应用) WEBAPP(网页应用) PUBLICAPP(生活号) TINYAPP(小程序) BASEAPP(基础应用) | [“TINYAPP”,“WEBAPP”] |
redirectUri | String | / | 是 | 回调页面地址,必须与第三方应用配置的 授权回调地址 一致。 | https://example.com |
state | String | 100 | 否 | 自定义参数,便于服务商识别是哪个商家的授权信息。对应的值必须为 base64 编码。 | MDAyMDIy |
import java.net.URLEncoder;
public class UrlGenerator {
public static void main(String[] args) {
String redirectUri = "https://example.com";
String appTypes = "[\"TINYAPP\",\"WEBAPP\"]";
String isvAppId = "2021003130652097";
String state = "MDAyMDIy";
generateUrls(redirectUri, appTypes, isvAppId, state);
}
public static void generateUrls(String redirectUri, String appTypes, String isvAppId, String state) {
try {
// 对参数进行 URL 编码
String encodedRedirectUri = URLEncoder.encode(redirectUri, "UTF-8");
String encodedAppTypes = URLEncoder.encode(appTypes, "UTF-8");
String encodedIsvAppId = URLEncoder.encode(isvAppId, "UTF-8");
String encodedState = URLEncoder.encode(state, "UTF-8");
// PC 端授权链接
String urlPC = "https://b.alipay.com/page/message/tasksDetail?bizData=UrlEncode({"
+ "\"platformCode\":\"O\","
+ "\"taskType\":\"INTERFACE_AUTH\","
+ "\"agentOpParam\":{"
+ "\"redirectUri\":\"" + encodedRedirectUri + "\","
+ "\"appTypes\":" + encodedAppTypes + ","
+ "\"isvAppId\":\"" + encodedIsvAppId + "\","
+ "\"state\":\"" + encodedState + "\""
+ "}})";
// 移动端二维码
String urlQR = "alipays://platformapi/startapp?appId=2021003130652097&page=pages%2Fauthorize%2Findex%3FbizData%3DUrlEncode({"
+ "\"platformCode\":\"O\","
+ "\"taskType\":\"INTERFACE_AUTH\","
+ "\"agentOpParam\":{"
+ "\"redirectUri\":\"" + encodedRedirectUri + "\","
+ "\"appTypes\":" + encodedAppTypes + ","
+ "\"isvAppId\":\"" + encodedIsvAppId + "\","
+ "\"state\":\"" + encodedState + "\""
+ "}})";
System.out.println("PC 端授权链接 URL: " + urlPC);
System.out.println("移动端二维码 URL: " + urlQR);
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、授权后获取app_auth_code
商家授权成功后,商家的页面跳转至服务商定义的回调地址(即 redirect_uri 参数对应的 URL),在回调页面请求中会带上当次授权的授权码 app_auth_code 和第三方应用的 APPID,示例如下。
http://example.com/doc/toAuthPage.html?app_id=2021000000000318&source=alipay_app_auth&application_type=TINYAPP,WEBAPP&app_auth_code=P1798b23682e34d96859afa000000003
就可获取到商户的app_auth_code了
五、使用 app_auth_code 换取 app_auth_token(支付宝官方文档)
服务商通过回调请求,获取到 app_auth_code 参数,然后调用 alipay.open.auth.token.app(换取应用授权令牌)接口,换取 app_auth_token。
说明:
• 应用授权的 app_auth_code 是唯一的。app_auth_code 使用一次后失效,单个授权的有效期为一天(从生成 app_auth_code 开始的 24 小时),未被使用自动过期。批量授权的有效期为 10 分钟。
• app_auth_token 在没有重新授权、取消授权或刷新授权的情况下,永久有效。
• 商家应用重新授权后,app_auth_token 会刷新(刷新后原 token 仍存在 5~10min 的缓存期),建议服务商通过系统链路将 app_auth_token 入库,可保障及时更新,发起代调用请求时从数据库读取该字段,以避免手动更新时影响存量线上业务。
请求参数说明
参数 | 类型 | 描述 | 示例 |
---|---|---|---|
grant_type | String | 换码类型,必填参数,以下值二选一。 authorization_code:使用 app_auth_code 换取 app_auth_token。 refresh_token:刷新 app_auth_token。 | authorization_code |
code | String | 授权码,当 grant_type 传入 authorization_code 时,必须传入本参数。传入授权获取的 app_auth_code 值。 | P1798b23682e34d96859afa000000003 |
refresh_token | String | 刷新令牌,上次换取访问令牌时得到。本参数在 grant_type 为 authorization_code 时不填;为 refresh_token 时必填,且该值来源于此接口的返回值 app_refresh_token(即至少需要通过 grant_type=authorization_code 调用此接口一次才能获取)。 | 201509BBdcba1e3347de4e75ba3fed2c9abebE36 |
请求示例
package com.java.sdk.demo;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.request.AlipayOpenAuthTokenAppRequest;
import com.alipay.api.response.AlipayOpenAuthTokenAppResponse;
import com.alipay.api.domain.AlipayOpenAuthTokenAppModel;
import com.alipay.api.FileItem;
import java.util.Base64;
import java.util.ArrayList;
import java.util.List;
public class AlipayOpenAuthTokenApp {
public static void main(String[] args) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
// 构造请求参数以调用接口
AlipayOpenAuthTokenAppRequest request = new AlipayOpenAuthTokenAppRequest();
AlipayOpenAuthTokenAppModel model = new AlipayOpenAuthTokenAppModel();
// 设置刷新令牌
model.setRefreshToken("201509BBdcba1e3347de4e75ba3fed2c9abebE36");
// 设置应用授权码
model.setCode("1cc19911172e4f8aaa509c8fb5d12F56");
// 设置授权方式
model.setGrantType("authorization_code或者refresh_token");
request.setBizModel(model);
// 第三方代调用模式下请设置app_auth_token
// request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
AlipayOpenAuthTokenAppResponse response = alipayClient.execute(request);
System.out.println(response.getBody());
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
}
}
private static AlipayConfig getAlipayConfig() {
String privateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->";
String alipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->";
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
return alipayConfig;
}
}
参数 | 描述 | 示例 |
---|---|---|
user_id | 商家的 UID。 | 2088102150527498 |
auth_app_id | 商家应用的 APPID。 | 2021002120000002 |
app_auth_token | 应用授权令牌。 | 202201BB6891c77a23d9450c930e3edc0000003 |
app_refresh_token | 刷新的新令牌。 | 202201BB27bcdfc7db37443ea4cf1203b0000029 |
expires_in | 令牌有效时间,该字段已作废,app_auth_token 在没有重新授权、取消授权或刷新授权的情况下,永久有效。 | 31536000 |
re_expires_in | 刷新令牌的有效时间(从接口调用时间作为起始时间),单位为秒。 | 32140800 |
响应示例
{
"alipay_open_auth_token_app_response": {
"code": "10000",
"msg": "Success",
"user_id": "2088102150000008",
"auth_app_id": "2021002120000002",
"app_auth_token": "202201BB6891c77a23d9450c930e3edc0000003",
"app_refresh_token": "202201BB6891c77a23d9450c930e3edc0000003",
"expires_in": 31536000,
"re_expires_in": 32140800
},
"sign": "***"
}
若商家授权指定应用,则返回该应用的授权结果信息,如下所示。
{
"alipay_open_auth_token_app_response":
{
"code":"10000",
"msg":"Success",
"tokens":
[
{
"app_auth_token":"201712BB_D0804adb2e743078d1822d536956X34",
"app_refresh_token":"201712BB_d5b15d53f7b4fd5aa649f176ca97X34",
"auth_app_id": "2017120501354689",
"expires_in": 31536000,
"re_expires_in": 32140800,
"user_id": "2088*******"
}
]
},
"sign":"***"
}
五、邀请商户入驻的实用技巧与注意事项
-
清晰明了的沟通
在向商户发送邀请时,务必使用简洁、易懂的语言清晰地阐述入驻的好处、流程和所需材料。可以制作图文并茂的操作指南或视频教程,帮助商户快速上手。 -
及时有效的支持
商户在入驻过程中可能会遇到各种问题,如技术难题、资质审核疑问等。作为服务商,要建立高效的客服渠道,及时响应商户的咨询和求助,确保商户能够顺利完成入驻。 -
严格遵守规定
支付宝对于服务商的业务操作有一系列严格的规定和政策,务必认真学习并严格遵守。任何违规行为都可能导致服务暂停甚至账号封禁,给您和商户带来不必要的损失。 -
数据安全与隐私保护
在处理商户信息时,要高度重视数据安全和隐私保护。采取严格的加密措施,确保商户信息不被泄露或滥用。 -
持续跟进与优化
邀请商户入驻只是第一步,后续要持续跟进商户的使用情况,收集反馈意见,不断优化服务质量,提升商户的满意度和忠诚度。
总之,邀请商户入驻支付宝服务商支付是一项充满挑战但极具潜力的工作。通过熟练掌握控制台生成授权链接/二维码和手动拼接授权链接的方法,结合良好的沟通技巧、优质的服务支持和严格的合规操作。