java微信支付v3最新版本 生成签名代码
时间: 2023-11-26 21:02:46 浏览: 164
由于微信支付接口的安全性要求较高,因此生成签名的代码相对较为复杂。以下是一个示例代码,供参考:
```java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class WechatPayUtils {
/**
* 生成32位随机字符串
*
* @return
*/
public static String generateNonceStr() {
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 32; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
}
/**
* 生成签名
*
* @param params
* @param key
* @return
*/
public static String generateSignature(Map<String, String> params, String key) {
StringBuilder sb = new StringBuilder();
// 将参数按照字典序排序
params.keySet().stream().sorted().forEach(keyStr -> {
String value = params.get(keyStr);
if (value != null && value.trim().length() > 0) {
sb.append(keyStr).append("=").append(value).append("&");
}
});
sb.append("key=").append(key);
// 使用MD5进行加密
String sign = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
sign = bytesToHexString(md.digest(sb.toString().getBytes("UTF-8")));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return sign;
}
/**
* 将字节数组转换为十六进制字符串
*
* @param bytes
* @return
*/
public static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte aByte : bytes) {
String hex = Integer.toHexString(aByte & 0xFF);
if (hex.length() == 1) {
sb.append("0");
}
sb.append(hex);
}
return sb.toString();
}
/**
* 构造请求参数
*
* @param appid
* @param mchId
* @param body
* @param outTradeNo
* @param totalFee
* @param spbillCreateIp
* @param notifyUrl
* @param tradeType
* @param openid
* @param key
* @return
*/
public static Map<String, String> buildRequestParams(String appid, String mchId, String body,
String outTradeNo, int totalFee, String spbillCreateIp,
String notifyUrl, String tradeType, String openid, String key) {
Map<String, String> params = new HashMap<>();
// 公众账号ID
params.put("appid", appid);
// 商户号
params.put("mch_id", mchId);
// 随机字符串
params.put("nonce_str", generateNonceStr());
// 商品描述
params.put("body", body);
// 商户订单号
params.put("out_trade_no", outTradeNo);
// 标价金额,单位为分
params.put("total_fee", String.valueOf(totalFee));
// 终端IP
params.put("spbill_create_ip", spbillCreateIp);
// 通知地址
params.put("notify_url", notifyUrl);
// 交易类型
params.put("trade_type", tradeType);
// 用户标识
if ("JSAPI".equals(tradeType)) {
params.put("openid", openid);
}
// 签名
params.put("sign", generateSignature(params, key));
return params;
}
}
```
使用示例:
```java
String appid = "wx1234567890abcdef";
String mchId = "1234567890";
String body = "测试商品";
String outTradeNo = "1234567890";
int totalFee = 100;
String spbillCreateIp = "192.168.0.1";
String notifyUrl = "http://example.com/notify";
String tradeType = "JSAPI";
String openid = "o7K8z0xM9t7E4tZjKv7nL1W2XnL2";
String key = "abcdefghijklmnopqrstuvwxyz012345";
Map<String, String> params = WechatPayUtils.buildRequestParams(appid, mchId, body, outTradeNo, totalFee, spbillCreateIp, notifyUrl, tradeType, openid, key);
```
注意:以上代码仅供参考,实际使用时需要替换为自己的参数和密钥,并根据具体情况进行调整。同时,签名算法和接口参数可能会随着微信支付接口的更新而有所变化,因此在使用时应该参考官方文档并及时更新代码。
阅读全文