支付宝小程序:插件 iframe 安全验证机制

小编:啊南 616阅读 2020.12.29

CCM 插件唤起机制
CCM 插件是通过打开 alipay.iservice.ccm.service.initialize(isv服务初始化接口)设置的 spi_endpoint 字段的链接唤起的,打开 spi_endpoint 链接时,CCM 会将页面上下文的信息以加密的形式加到 url 参数 encryptedContent 上,并加入其它协议及安全相关参数,如:对 url 参数的签名。商户或 ISV 收到 spi_endpoint 请求后,应使用 alipay.iservice.ccm.service.initialize 接口预设的应用公私钥对及返回的 CCM 公钥按下面的安全验证机制,完成对接口的验签和解密。

 

商户或 ISV iframe 公私钥对生成
alipay.iservice.ccm.service.initialize(isv服务初始化接口)预设的应用公私钥对可以参考以下 JAVA 代码生成。

import java.security.*;r......rpublic static void main(String[] args) throws Exception {rr  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");r  keyPairGen.initialize(2048);r  eyPair keyPair = keyPairGen.generateKeyPair();r  String publicKey = Base64Util.encode(keyPair.getPublic().getEncoded());r  String privKey = Base64Util.encode(keyPair.getPrivate().getEncoded());r  System.out.println("pubkey=" + publicKey);r  System.out.println("privkey=" + privKey);rr}
 

 

CCM 插件安全验证机制
iframe url 参数说明:

method:SPI 配置中的 method,用来告诉第三方系统这是一个什么样类型的 iframe;

version:该业务数据的格式版本;

encryptedContent:业务数据被 AESKey 加密后的内容。其原始内容为参数 context 的值中增加用户信息。比如:{"user":{"id":"2015112381984298",  "nickName":"威博"}, "timestamp":"2018-12-20T07:40:31Z"},如果是在工单详情页,会额外增加工单id信息,比如:{"ticket":{"id":"1234", "ccsInstanceId":"ZPAKAA"},  "user":{"id":"2015112381984298",  "nickName":"威博"}, "timestamp":"2018-12-20T07:40:31Z"};

encryptType:加密算法名称,AES;

AESKey:加密秘钥密文,使用商户或 ISV 自己的公钥加密, Base64 编码格式;商户或 ISV 可使用私钥解密得到AES加密密钥明文;

extProperty:扩展属性;

signature:Base64(rsaSign(除 signature 参数外的其他参数值拼接, ccm 私钥)),签名参数拼接顺序按参数名字典序排序。
关联标签: