要在您的应用中使用生活号的相关接口,您需要先创建登记您的生活号应用,并提交审核,审核通过后会为您生成应用唯一标识(APPID),并且可以申请开通开放产品使用权限,通过APPID您的应用才能调用开放产品的接口能力。
创建生活号应用的步骤如下:
开发者可直接使用需要创建生活号的支付宝账号,登录生活号后台(fuwu.alipay.com)。填写生活号信息,入驻生活号,生活号入驻后,支付宝工作人员会在5个工作日内审核,入驻流程截图如下
开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。
生活号激活开发者模式的过程是支付宝网关向开发者网关推送一条指定格式的消息,开发者网关收到这条消息后,必须同步返回给支付宝网关指定内容的消息,支付宝网关对这条消息验证通过后,开发者模式就激活了。激活开发者模式后,支付宝会认为开发者有能力对接生活号相关接口,开发者才能调用相关的生活号api接口。
流程概述
JAVA版生活号demo激活开发者模式步骤:
1. 登录蚂蚁金服开放平台,点击“管理中心”,进入生活号应用详情页面,点击“验证应用网关”。
2. 下载生活号demo,将生活号demo中AlipayServiceEnvConstants类中的APP_ID、PRIVATE_KEY参数替换为开发者自己的生活号应用的appid,以及自己的私钥。将与私钥对应的公钥写入步骤1中的应用公钥(RSA)输入框中。
3. 将demo程序部署到服务器上,公网需要能够访问到该服务,将demo程序中GatewayServlet的访问路径写入步骤1中的应用网关输入框中(如该demo服务的外网地址为http://test.fuwuchuang.com,此时应用网关为http://test.fuwuchuang.com/fuwuchuang_demo/gateway.do)。
4. 点击确定按钮,此时支付宝会向该应用网关发送一条验证消息,该应用网关需对此消息进行验签,验签成功后会向支付宝回写一个true字符串消息(具体逻辑请参见demo中GatewayServlet类的doPost方法),支付宝收到此消息后,开发者模式即成功激活了,此时开发者便可开始调用生活号相关接口。
5. 修改生活号应用网关与激活开发者模式相同,支付宝会向新的应用网关发送一条验证消息,新应用网关需对此消息进行验签,验签成功后向支付宝回写一个true字符串消息,支付宝收到响应后,应用网关修改成功。
开发者接入验证消息
消息标识:alipay.service.check
使用场景举例:开发者激活开发者模式时,支付宝网关向开发者网关发送验证消息。
当开发者完成网关代码的部署之后,便可以点击“提交”按钮,激活开发者模式,接入生活号接口。此时,支付宝网关会向开发者网关发送一条验证消息,以POST方式请求,以下为一个请求示例:
REQUEST URL: http://example.com/gateway.do REQUEST METHOD: POST CONTENT: service=alipay.service.check sign=ntjOmXFGJMdfdMnrTL5rEp9QG8d0lDEoGg3ZHvqemHeI8BlQoEsFbhEn0IfQT+pvfJz5RCuE+3Qh1X7I4z5iTIiGjDBstc0xeuiAmtP9TrJZuw2jUAODFB9qOwBJLNcWlKHUGTU/db/qRsJQCj8EjoJvSi9MRM/xKv/XmduS/C4= sign_type=RSA2 charset=GBK biz_content=<?xml version="1.0" encoding="gbk"?><XML><AppId><![CDATA[2014072300007148]]></AppId><FromUserId></FromUserId><CreateTime><![CDATA[1406083506817]]></CreateTime><MsgType><![CDATA[event]]></MsgType><EventType><![CDATA[verifygw]]></EventType><ActionParam></ActionParam><AgreementId></AgreementId><AccountNo></AccountNo></XML>
支付宝网关发送的POST消息中 biz_content 的内容示例如下:
<?xml version="1.0" encoding="gbk"?> <XML> <AppId><![CDATA[2014072300007148]]></AppId> <FromUserId></FromUserId> <CreateTime><![CDATA[1406083506817]]></CreateTime> <MsgType><![CDATA[event]]></MsgType> <EventType><![CDATA[verifygw]]></EventType> <ActionParam></ActionParam> <AgreementId></AgreementId> <AccountNo></AccountNo> </XML>
参数名 | 是否必须 | 参数说明 |
---|---|---|
AppId |
是 |
服务窗APPID |
FromUserId |
是 |
空值 |
CreateTime |
是 |
消息创建时间 |
MsgType |
是 |
消息类型,事件类消息固定为event |
EventType |
是 |
事件类型,固定为verifygw |
ActionParam |
是 |
空值 |
AgreementId |
是 |
空值 |
AccountNo |
是 |
空值 |
开发者接收到该消息之后,需要使用支付宝的公钥对签名作验证,以确保该消息来源可靠。
将支付宝返回的POST参数(不包含sign参数)做字母排序,组成query类型的字符串,比如上文的POST请求组成的query类型字符串为:
biz_content=<?xml version="1.0" encoding="gbk"?><XML><AppId><![CDATA[2014072300007148]]></AppId><FromUserId></FromUserId><CreateTime><![CDATA[1406083506817]]></CreateTime><MsgType><![CDATA[event]]></MsgType><EventType><![CDATA[verifygw]]></EventType><ActionParam></ActionParam><AgreementId></AgreementId><AccountNo></AccountNo></XML>&charset=GBK&service=alipay.service.check&sign_type=RSA2
将签名参数使用base64解码为字节码串。
使用OpenSSL的验签方法及支付宝公钥验证签名,以下为php代码的一个片段,其中$data为经过1排序处理后的query字符串,$rsaPublicKeyFilePath指支付宝公钥PEM文件的文件地址。
/* 使用支付宝的公钥对支付宝来的消息进行验签 */ public function verify($data, $sign, $rsaPublicKeyFilePath) { /* 读取公钥文件,PEM格式 */ $pubKey = file_get_contents($rsaPublicKeyFilePath); /* 转换为openssl格式密钥 */ $res = openssl_get_publickey($pubKey); /* 调用openssl内置方法验签 */ $result = (bool) openssl_verify($data, base64_decode($sign), $res); /* 释放资源 */ openssl_free_key($res); /* 返回验签结果 */ return $result; }
返回验签成功消息
开发者验签成功之后,需要向支付宝网关回复一条消息,表示验签成功。支付宝收到符合规则的消息之后,开发者模式就激活了。以下为回复消息的格式(其中biz_content为开发者公钥):
<?xml version="1.0" encoding="GBK"?> <alipay> <response> <biz_content>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB</biz_content> <success>true</success> </response> <sign>DXr8LVfHytoZ3RR0K95pzGtA3d9LdpjIjLEis2BDIPQisPwS+FMFxZt9NCMt531EeDj/nbzoIAz8Or7PuqxNfSzNI8qnhirm/Hvr8uedXX9JiQxHu8q3Rw2lJWD8cqQzgf3xwV/+wbN8yuI7s8xjo6odq6NCqrAIu7E0DDfZyKo=</sign> <sign_type>RSA2</sign_type> </alipay>
待签名字符串为<response>节点内的内容,即下例(去除空格):
<biz_content>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB</biz_content><success>true</success>
参考demo集成接入
在了解demo时,请结合demo中的“服务窗DEMO使用手册.docx”文档,该文档是结合demo编写的说明文档,对demo的每个类以及服务窗接口集成要求,做了详细的说明,此处不再赘述。