生活号快速接入

第一步:创建生活号应用

要在您的应用中使用生活号的相关接口,您需要先创建登记您的生活号应用,并提交审核,审核通过后会为您生成应用唯一标识(APPID),并且可以申请开通开放产品使用权限,通过APPID您的应用才能调用开放产品的接口能力。
创建生活号应用的步骤如下:
开发者可直接使用需要创建生活号的支付宝账号,登录生活号后台(fuwu.alipay.com)。填写生活号信息,入驻生活号,生活号入驻后,支付宝工作人员会在5个工作日内审核,入驻流程截图如下





第二步:配置密钥

开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。

第三步:激活开发者模式

生活号激活开发者模式的过程是支付宝网关向开发者网关推送一条指定格式的消息,开发者网关收到这条消息后,必须同步返回给支付宝网关指定内容的消息,支付宝网关对这条消息验证通过后,开发者模式就激活了。激活开发者模式后,支付宝会认为开发者有能力对接生活号相关接口,开发者才能调用相关的生活号api接口。
流程概述


JAVA版生活号demo激活开发者模式步骤:
1. 登录蚂蚁金服开放平台,点击“管理中心”,进入生活号应用详情页面,点击“验证应用网关”。



image.png


2. 下载生活号demo,将生活号demo中AlipayServiceEnvConstants类中的APP_ID、PRIVATE_KEY参数替换为开发者自己的生活号应用的appid,以及自己的私钥。
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;
}


返回验签成功消息


开发者验签成功之后,需要向支付宝网关回复一条消息,表示验签成功。支付宝收到符合规则的消息之后,开发者模式就激活了。


回复消息的格式在公钥签名和公钥证书签名两种场景下有所区别,下面分别介绍这两种场景的回复消息格式:


普通公钥签名方式

<?xml version="1.0" encoding="GBK"?>
<alipay>
    <response>
        <success>true</success>
    </response>
    <sign>DXr8LVfHytoZ3RR0K95pzGtA3d9LdpjIjLEis2BDIPQisPwS+FMFxZt9NCMt531EeDj/nbzoIAz8Or7PuqxNfSzNI8qnhirm/Hvr8uedXX9JiQxHu8q3Rw2lJWD8cqQzgf3xwV/+wbN8yuI7s8xjo6odq6NCqrAIu7E0DDfZyKo=</sign>
    <sign_type>RSA2</sign_type>
</alipay>


公钥证书签名方式

<?xml version="1.0" encoding="GBK"?>
<alipay>
    <response>
        <success>true</success>
    </response>
    <app_cert_sn>6cd4ee7e4f31c1adba2380cc65da4a3a</app_cert_sn>
    <sign>DXr8LVfHytoZ3RR0K95pzGtA3d9LdpjIjLEis2BDIPQisPwS+FMFxZt9NCMt531EeDj/nbzoIAz8Or7PuqxNfSzNI8qnhirm/Hvr8uedXX9JiQxHu8q3Rw2lJWD8cqQzgf3xwV/+wbN8yuI7s8xjo6odq6NCqrAIu7E0DDfZyKo=</sign>
    <sign_type>RSA2</sign_type>
</alipay>


从上面示例可以看到,在公钥证书签名的方下,响应报文里多了一个参数app_cert_sn(应用公钥证书序列号),支付宝会在开发者上传应用公钥证书中,寻找匹配的应用公钥证书对响应报文验签。


app_cert_sn值是通过解析应用公钥证书文件中签发机构名称(name)以及内置序列号(serialNumber),将二者拼接后的字符串计算MD5值获取,可参考开放平台SDK源码中AlipaySignature.getCertSN实现:

/**
  * 获取证书序列号
  * @param certPath X.509证书文件路径
  * @return 返回证书序列号
  * @throws AlipayApiException
  */
public static String getCertSN(String certPath)


不管是普通公钥签名方式,还是公钥证书签名方式,待签名字符串均为<response>节点内的内容,即下例(去除空格):


<success>true</success>

第四步:获取接口权限

要调用生活号接口,必须先获取生活号接口权限,生活号接口包必须签约后才能使用。普通类型应用无法使用生活号接口。获取过程如下图所示


点击“继续添加”



确认添加:



接入方案

参考demo集成接入
点此下载demo JAVA版.NET版PHP版
在了解demo时,请结合demo中的“生活号DEMO使用手册.docx”文档,该文档是结合demo编写的说明文档,对demo的每个类以及生活号接口集成要求,做了详细的说明,此处不再赘述。