700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 支付宝小程序根据验签与解密处理解析获取手机号码

支付宝小程序根据验签与解密处理解析获取手机号码

时间:2020-08-01 05:43:51

相关推荐

支付宝小程序根据验签与解密处理解析获取手机号码

1.进入小程序详情页 > 开发设置 > 内容加密方式,首次设置可以看到设置按钮(若已设置则为查看按钮),经过核身校验后可以查看 AES 设置页面(该密钥由蚂蚁开放平台生成,开发者仅需要将密钥配置到你的系统中即可)注意:若已配置密钥,请谨慎重新重新生成密钥,否则若你的服务端密钥没有更新最新密钥会导致解密失败 如下图:

2.在 小程序详情页 > 设置 > 开发设置页面,按照下图操作查看支付宝 RSA2 公钥(若看不到查看支付宝公钥入口,请按照“设置应用公钥”文档设置应用的 RSA2 公钥) 如下图:

3.在涉及敏感数据的情况下,jsApi返回的结果是密文,同时会对报文进行签名,需要传递到开发者服务端进行报文解密,整体的交互流程如下图所示:

4.完整报文示例:涉及到开发者服务端处理的安全操作包括:解密和验签。由于是否加密取决于数据的安全的敏感程度,所以存在明文的情况。res.response为完整的报文数据,示例如下(为了展示方便,报文示例均作了json的美化处理) 如下:

{

"response": "hvDOnibG0DPcOFPNubK3DEfLQGL4=",

"sign": "OIwk7zfZMp5GX78Ow==",

"sign_type": "RSA2",

"encrypt_type": "AES",

"charset": "UTF-8"

}

5.验签与解密处理 无论是否涉及解密,Java后端处理逻辑都可以按照下述逻辑处理(以下代码仅作为代码示例,生产环境使用请注意异常处理逻辑;其它语言请参考常见问题中验签解密通用逻辑的说明) 代码如下:

public ResultsCode plainData(JSONObject jsonObject) throws Exception {JSONObject jsonStr = jsonObject.getJSONObject("jsonstr");String content = jsonStr.getString("encryptedData");//即前端传过来的response报文String sign = jsonStr.getString("sign");//对response报文的签名String signType = "RSA2";String charset = "UTF-8";String encryptType = "AES";//如果密文的boolean isDataEncrypted = !content.startsWith("{");boolean signCheckPass = false;//2. 验签String signContent = content;//你的小程序对应的支付宝公钥(为扩展考虑建议用appId+signType做密钥存储隔离)String signVeriKey = this.signVeriKey;//你的小程序对应的加解密密钥(为扩展考虑建议用appId+encryptType做密钥存储隔离)String decryptKey = this.decryptKey;//如果是加密的报文则需要在密文的前后添加双引号if (isDataEncrypted) {signContent = "\"" + signContent + "\"";}try {signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);} catch (AlipayApiException e) {//验签异常, 日志}if (!signCheckPass) {//验签不通过(异常或者报文被篡改),终止流程(不需要做解密)return ResultsCode.failure(MsgCode.defaultNullPoint.getCode(), MsgCode.defaultNullPoint.getMsg());}//3. 解密String plainData = null;if (isDataEncrypted) {try {plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);} catch (AlipayApiException e) {e.printStackTrace();//解密异常, 记录日志return ResultsCode.failure(MsgCode.defaultNullPoint.getCode(), MsgCode.defaultNullPoint.getMsg());}} else {plainData = content;}JSONObject object = JSONObject.parseObject(plainData);if (object != null && "10000".equals(object.getString("code"))) {return ResultsCode.success(object);}return ResultsCode.failure(MsgCode.governmentQueryField.getCode(), MsgCode.governmentQueryField.getMsg());}

6.调用方法 解析数据如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。