概述
@Javen 大佬,这个问题我后面解决了。我用同样的参数,使用上图中的方法,会报签名错误,我后来不直接创建签名,而是使用tomap方法,把对象转成map,接着在使用自己写的工具类生成签名及发送https请求,这时候发放红包的功能就能正常使用,我下面贴上我代码,大佬你看下是我上面的写法有问题吗?
Map params = SendReadPackModel.builder()
.nonce_str(String.valueOf(System.currentTimeMillis()))
.mch_billno(wxSendRedBagDTO.getOrderNo())
.mch_id(wxPayApiConfig.getMchId())
.wxappid(wxPayApiConfig.getAppId())
.send_name(wxSendRedBagDTO.getSendName())
.re_openid(wxSendRedBagDTO.getOpenId())
.total_amount(String.valueOf(wxSendRedBagDTO.getTotalAmount()))
.total_num(String.valueOf(1))
.wishing(wxSendRedBagDTO.getWishing())
.client_ip(wxSendRedBagDTO.getClientIp())
.act_name(wxSendRedBagDTO.getActName())
.remark(wxSendRedBagDTO.getRemark())
.scene_id(wxSendRedBagDTO.getSceneId()).build().toMap();
String sign = WechatUtils.getWechatPaySign(params, wxPayApiConfig.getPartnerKey());
params.put("sign", sign);
String result = WechatUtils.sendHttpsWx(WxUrlEnum.SEND_RED_BAG.getCode(),params, wxPayApiConfig.getCertPath(), wxPayApiConfig.getMchId());
工具类:
@Slf4j
public class WechatUtils {
/**
* 获得支付签名(微信支付,现金红包)
*/
@SuppressWarnings("rawtypes")
public static String getWechatPaySign(Map parameters, String payKey) {
SortedMap sort = new TreeMap(parameters);
StringBuffer sb = new StringBuffer();
// 所有参与传参的参数按照ACCSII排序(升序)
Set es = sort.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k) && !"serialVersionUID".equals(k)) {
sb.append(k + "=" + v + "&");
System.err.println(k + "t" + v);
}
}
sb.append("key=" + payKey);
return SecureUtil.md5(sb.toString()).toUpperCase();
}
/**
* 发送https请求给微信
* @param param
* @param certPath
* @param mchId
* @return
*/
public static String sendHttpsWx(String url,Map param, String certPath, String mchId) {
try {
return HttpRequest.post(url)
.setSSLSocketFactory(SSLSocketFactoryBuilder.create().setProtocol(SSLSocketFactoryBuilder.TLSv1)
.setKeyManagers(getKeyManager(mchId, certPath, null)).setSecureRandom(new SecureRandom())
.build())
.body(WxPayKit.toXml(param)).execute().body();
} catch (Exception e) {
log.error("发送请求异常:{}", e);
}
return null;
}
private static KeyManager[] getKeyManager(String certPass, String certPath, InputStream certFile) throws Exception {
KeyStore clientStore = KeyStore.getInstance("PKCS12");
if (certFile != null) {
clientStore.load(certFile, certPass.toCharArray());
} else {
clientStore.load(new FileInputStream(certPath), certPass.toCharArray());
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientStore, certPass.toCharArray());
return kmf.getKeyManagers();
}
最后
以上就是美好外套为你收集整理的微信红包发放接口服务器签名失败,WxPayApi.sendRedPack 发送普通红包,微信返回签名错误,有大佬遇到过吗?版本是2.3.2版本...的全部内容,希望文章能够帮你解决微信红包发放接口服务器签名失败,WxPayApi.sendRedPack 发送普通红包,微信返回签名错误,有大佬遇到过吗?版本是2.3.2版本...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复