WXPayConfigCustom configCustom = new WXPayConfigCustom();
try {
WXPay wxPay = new WXPay(configCustom);
Map<String, String> reqData = new HashMap<>();
reqData.put("body", "测试产品1111"); //产品名称 如 测试产品1111
reqData.put("out_trade_no", "1111111111"); //产品订单号
reqData.put("trade_type", "APP"); //如果其他支付,请更改
reqData.put("total_fee", "1111"); //支付金额 微信支付是从分开始算 如1元=100分
reqData.put("spbill_create_ip", "127.0.0.1");
reqData.put("notify_url", "http://hwrvwa.natappfree.cc/notice/pay/notifyStatus2"); // 异步回调通知
//向微信支付发起请求,返回 xml-->Map
Map<String, String> map = wxPay.unifiedOrder(reqData);
1. 获取到map参数如下
2. reqdata如下 进行判断是HmacSHA256加密类型或者md5加密类型
3. 这个是sign生成的加密方式
获取sign的两种方式,官方给出的数据是这样的
首先从map中获取需要拼接的6个参数如下 可以与上一步进行连接
if (map != null) {
String prepayid = map.get("prepay_id");
String sign = map.get("sign");
if (prepayid != null && !prepayid.equals("")) {
String noncestr = WXPayUtil.generateNonceStr();
String timestamp = String.valueOf(WXPayUtil.getCurrentTimestamp());
Map<String, String> signMap = new HashMap<String, String>();
signMap.put("appid", "开发者id");
signMap.put("partnerid", "商户id");
signMap.put("prepayid", prepayid);
signMap.put("package", "Sign=WXPay");
signMap.put("noncestr", noncestr);
signMap.put("timestamp", timestamp); //时间搓
由第2步进行获取加密的类型进行加密 可以与上一步连接
Map<String, String> resultMap = new HashMap<String, String>();
resultMap.put("prepayid", prepayid);
resultMap.put("sign", paySignDesposit(signMap, "key")); //HmacSHA256加密类型签名
// resultMap.put("sign", generateSignature(signMap, "key")); //md5加密类型签名
resultMap.put("appid", "appid");
resultMap.put("timestamp", timestamp); //等于请求prepayId时的
resultMap.put("noncestr", noncestr); //与请求prepayId时值一致
resultMap.put("package", "Sign=WXPay"); //固定常量
resultMap.put("partnerid", "商户id");
System.out.println("返回给app数据:" + resultMap);
return resultMap;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
HmacSHA256类型签名 签名加密类型二选一
/**
* HmacSHA256类型签名
* @param map
* @return
* @throws UnsupportedEncodingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
*/
public static String paySignDesposit(Map map, String key) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
Map params = new HashMap();
Set set = map.keySet();
for (Object string : set) {
if(!map.get(string).equals("")){
params.put(string, String.valueOf(map.get(string)));
}
}
String string1 = createSign(params);
String stringSignTemp = string1 + "&key=" + key;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
return byteArrayToHexString(sha256_HMAC.doFinal(stringSignTemp.getBytes("utf-8"))).toUpperCase();
}
/**
* 将加密后的字节数组转换成字符串
*
* @param b 字节数组
* @return 字符串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b!=null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toLowerCase();
}
/**
* 构造package
* @param params
* @return
* @throws UnsupportedEncodingException
*/
public static String createSign(Map params) throws UnsupportedEncodingException {
Set keysSet = params.keySet();
Object[] keys = keysSet.toArray();
Arrays.sort(keys);
StringBuffer temp = new StringBuffer();
boolean first = true;
for (Object key : keys) {
if (first) {
first = false;
} else {
temp.append("&");
}
temp.append(key.toString()).append("=");
Object value = params.get(key);
String valueString = "";
if (null != value) {
valueString = value.toString();
}
temp.append(valueString);
}
return temp.toString();
}
}
生成MD5加密
/**
* 微信支付:生成MD5加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static String generateSignature(final Map<String, String> data, final String key) throws Exception {
Set<String> keySet = data.keySet();
String[] keyArray = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArray);
StringBuilder sb = new StringBuilder();
for (String k : keyArray) {
if (k.equals(WXPayConstants.FIELD_SIGN)) {
continue;
}
if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
sb.append(k).append("=").append(data.get(k).trim()).append("&");
}
String result = sb.append("key=" + key).toString();
return MD5(result).toUpperCase();
}
/**
* 生成 MD5
*
* @param
* @param data 待处理数据
* @return MD5结果
*/
public static String MD5(String data) throws Exception {
java.security.MessageDigest md = MessageDigest.getInstance("MD5");
byte[] array = md.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString().toUpperCase();
}
根据加密类型进行选着是HmacSHA256加密类型或者md5加密类型
工具类:WXPayConfigCustom
package com.yami.shop.service;
import com.github.wxpay.sdk.IWXPayDomain;
import com.github.wxpay.sdk.WXPayConfig;
import com.github.wxpay.sdk.WXPayConstants;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class WXPayConfigCustom extends WXPayConfig {
/**
* 开发者ID(AppID)
* @return
*/
@Override
protected String getAppID() {
return "AppID";
}
/**
* 商户号
* @return
*/
@Override
protected String getMchID() {
return "商户号";
} /**
/**
* appkey API密钥
* @return
*/
@Override
protected String getKey() {
return " API密钥";
}
// 退款:必须强制使用API证书
@Override
protected InputStream getCertStream() {
try {
String path = ClassLoader.getSystemResource("").getPath();
return new FileInputStream(new File(path+"apiclient_cert.p12"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
@Override
protected IWXPayDomain getWXPayDomain() {
return new IWXPayDomain() {
@Override
public void report(String s, long l, Exception e) {
}
@Override
public DomainInfo getDomain(WXPayConfig wxPayConfig) {
return new DomainInfo(WXPayConstants.DOMAIN_API, true);
}
};
}
}
调取获得的结果可以进行调用官方给出的验证工具
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1