对响应消息验签
在接口调用过程中,请求方在获取接收方的响应结果后,如果返回结果中包含了查询结果的签名字符串,请求方可以对签名字符串使用支付公钥进行验签,确认返回结果没有被篡改。建议您把公钥存放在服务端并在服务端来完成签名校验,保证接口调用的安全性。
1、获取需要验签的返回结果字符串,例如getPurchases接口返回的inAppPurchaseDataList中商品信息需要验签,先取第1条商品信息的JSON字符串参与验签。
2、获取对应的签名字符串,例如getPurchases接口返回的inAppSignature对应inAppPurchaseDataList的签名字符串,取第1条商品信息的签名字符串参与验签。
3、使用支付公钥对结果字符串和对应的签名字符串通过SHA256WITHRSA算法进行验证。
JAVA示例代码如下:
/** 
 * 校验签名信息 
 * @param content 结果字符串 
 * @param sign 签名字符串 
 * @param publicKey 支付公钥 
 * @return 是否校验通过 
 */ 
public static boolean doCheck(String content, String sign, String publicKey) {
    if (sign == null) {
        return false;
    }
    if (publicKey == null) {
        return false;
    }
    try {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        byte[] encodedKey = Base64.decode(publicKey);
        PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));

        java.security.Signature signature = null;
        signature = java.security.Signature.getInstance("SHA256WithRSA");
 
        signature.initVerify(pubKey);
        signature.update(content.getBytes(StandardCharsets.UTF_8));

        byte[] bsign = Base64.decode(sign);
        return signature.verify(bsign);
    } catch (RuntimeException e) {
        throw e;
    } catch (Exception e) {
        e.printStack();
    }
    return false;
}