新系统登录 | 旧系统登录

支付完成之后的通知

2020-02-11 06:13:20 admin 4

支付完成后通知

本接口用于支付成功之后的通知,支付完成后采宝会将如下参数post到相关地址。

收到本接口的回调数据后,请异步处理订单逻辑,支付完成后的通知采用的是RSA签名算法,具体生成sign签名逻辑请看RSA请求签名规则, 并返回success字符串(必须完全相同,不能有任何其他字符),否则采宝会尝试进行重试,重试时间会不断加长。

参数简介

参数名参数介绍
cbOrderNo采宝的订单号,最长64位
appOrderNo调用方自己生成的订单号
outOrderNo微信或支付宝产生的订单号
orderStatus订单状态,详情参照:订单状态详解
totalAmount订单总额,以分为单位
receiveAmount实收金额,以分为单位
paymentChannel支付渠道, 详情参照:支付渠道详解
subject订单简介
discountAmount优惠金额,以分为单位
paymentWay支付方式,详情参照:支付方式详解
payTime支付时间,数字格式,值为距离1970.1.1日的毫秒数
sign签名值,具体参照: 接口验签规则

Rsa验证签名方法示例(java)

/**
 * 排序需要签名的字段
 * @param sortedParams 参数Map
 * @return
 */
public static String getSignContent(Map sortedParams) {
StringBuffer content = new StringBuffer();
ArrayList keys = new ArrayList(sortedParams.keySet());
Collections.sort(keys);
int index = 0;

for(int i = 0; i < keys.size(); ++i) {
String key = (String)keys.get(i);
String value = (String)sortedParams.get(key);
if (StringUtils.isNotEmpty(value)) {
content.append((index == 0 ? "" : "&") + key + "=" + value);
++index;
}
}

return content.toString();
}


/**
 * 验证签名
 * @param content 签证签名内容串
 * @param sign 签名
 * @param publicKey 公钥
 * @param charset 字符集
 * @param signType 签名类型
 * @return
 * @throws RsaSignException
 */
public static boolean rsaCheck(String content, String sign, String publicKey, String charset, String signType) throws RsaSignException {
if ("RSA".equals(signType)) {
return rsaCheckContent(content, sign, publicKey, charset);
} else if ("RSA2".equals(signType)) {
return rsa256CheckContent(content, sign, publicKey, charset);
} else {
throw new RsaSignException("Sign Type is Not Support : signType=" + signType);
}
}

public static PublicKey getPublicKeyFromX509(String algorithm, InputStream ins) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
StringWriter writer = new StringWriter();
StreamUtil.io(new InputStreamReader(ins), writer);
byte[] encodedKey = writer.toString().getBytes();
encodedKey = Base64.decodeBase64(encodedKey);
return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
}

public static boolean rsaCheckContent(String content, String sign, String publicKey, String charset) throws RsaSignException {
try {
PublicKey e = getPublicKeyFromX509("RSA", new ByteArrayInputStream(publicKey.getBytes()));
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initVerify(e);
if (CheckUtil.isEmpty(charset)) {
signature.update(content.getBytes());
} else {
signature.update(content.getBytes(charset));
}

return signature.verify(Base64.decodeBase64(sign.getBytes()));
} catch (Exception var6) {
throw new RsaSignException("RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, var6);
}
}

public static boolean rsa256CheckContent(String content, String sign, String publicKey, String charset) throws RsaSignException {
try {
PublicKey e = getPublicKeyFromX509("RSA", new ByteArrayInputStream(publicKey.getBytes()));
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initVerify(e);
if (CheckUtil.isEmpty(charset)) {
signature.update(content.getBytes());
} else {
signature.update(content.getBytes(charset));
}

return signature.verify(Base64.decodeBase64(sign.getBytes()));
} catch (Exception var6) {
throw new RsaSignException("RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, var6);
}
}


首页
产品
活动
联系