java遇到⼩程序⽀付验证签名失败问题解决最近在做⼀个⼩程序项⽬做到⽀付的时候遇到的⼀些问题!
详细步骤:
开发前准备(必须)
  ⼩程序标识(appid):wx4d4838ebec29b8**
  商户号(mch_id):15508070**
  商户密钥(key):wHtQckdfiRBVF7ceGTcSWEEORt6C0D**
下载 SDK完成后: 
开始写我们的程
选择⼩程序⽀付
选择 API列表统⼀下单可以看到接⼝链接和请求参数,你需要看下每个参数什么意思,接下来就需要知道怎么操作这些参数就可以了 ok
⼀⾸先把刚下载的提供的 SDK 拷贝到你的项⽬⾥⾃定义⼀个类继承⾥⾯的⼀个WXPayConfig 抽象类
public class MyWxPayConfig extends WXPayConfig {
private byte[] certData;
public MyWxPayConfig() throws Exception { }
public String getAppID() {
return "wx4d4838ebec29b8** "; //你的appid
}
public String getMchID() {
return "15508070**";  //你的商户号mch_id
}
public String getKey() {
return "wHtQckdfiRBVF7ceGTcSWEEORt6C0D**";    //你的商户号秘钥 key
}
public InputStream getCertStream() {
ByteArrayInputStream certBis = new Data);
return certBis;
}
public int getHttpConnectTimeoutMs() {
return 8000;
}
public int getHttpReadTimeoutMs() {
return 10000;
}
public IWXPayDomain getWXPayDomain() {
// 这个⽅法需要这样实现, 否则⽆法正常初始化WXPay
IWXPayDomain iwxPayDomain = new IWXPayDomain() {
public void report(String domain, long elapsedTimeMillis, Exception ex) {
}
public DomainInfo getDomain(WXPayConfig config) {
return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);    //⼯具常量类有 "h.weixin.qq"; wxpay.unifiedorder() /pay/unifiedorder      }
  };
  return iwxPayDomain;
}
}
到 SDK 中的 WxPay 类修改⾥⾯的代码
public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
this.autoReport = autoReport;
this.useSandbox = useSandbox;
if (useSandbox) {
this.signType = SignType.MD5; // 沙箱环境
}
else {
// this.signType = SignType.HMACSHA256;  //注意:这点是个坑!默认是HMACSHAS56加密⼀定要修改成MD5 不然⽆论如何都会报 “签名失败” 的错误!
this.signType = SignType.MD5;
}
this.wxPayRequest = new WXPayRequest(config);
}
可知前端所需要的参数我们直接反回给他们就ok!
java⽀付代码
//你⾃⼰需要定义⼀个⽅法
  public static void main(String[] args) throws Exception {
//统⼀下单⽀付
HashMap<String, String> map = new HashMap<>();
IdWorker idWorker = new IdWorker();      //⾃定义订单号类
long out_trade_no = Id();    //获取订单号
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
Map<String, String> data = new HashMap<>();
data.put("body", "⽀付");  //商品描述
data.put("total_fee", "1");  // 标价⾦额单位:分
data.put("openid", "你传来的openid");  //⽤户标识 trade_type=JSAPI,此参数必传,⽤户在商户appid下的唯⼀标识
data.put("out_trade_no", out_trade_no + "");  //商户系统内部订单号
data.put("nonce_str",ateNonceStr()); //随机字符串,长度要求在32位以内。推荐随机数⽣成算法
data.put("spbill_create_ip", WeiXinHelper.localIp());  //⽀持IPV4和IPV6两种格式的IP地址。调⽤⽀付API的机器IP ⾃定获取ip
data.put("notify_url", "www.weixin.qq/wxpay/pay.php"); // 没⽤到.通知地址:通知url必须为外⽹可访问的url,不能携带参数。
data.put("trade_type", "JSAPI");  //交易类型
data.put("sign_type", WXPayConstants.MD5); //签名类型//MyWxPayConfig 配置了⼀些默认信息 appid,商户号,商户秘钥,请求域名 ..
MyWxPayConfig myWxPayConfig = new MyWxPayConfig();
WXPay wxpay = new WXPay(myWxPayConfig);
Map<String, String> rMap = wxpay.unifiedOrder(data);  //⽣成⼀次签名 sign
System.out.println(rMap);
     // 下⾯只是为了⽣成第⼆次签名仅此⽽已
String return_code = ("return_code");//返回状态码
String result_code = ("result_code");//结果状态码
    String nonce_str = ("nonce_str"); //随即字符串
Long s = System.currentTimeMillis() / 1000;  //获取时间戳除以千变字符串
String timeStamp = String.valueOf(s);
if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {
map.put("appId", “appid”);    //你的appid
map.put("timeStamp", timeStamp);//这边要将返回的时间戳转化成字符串,不然⼩程序端调⽤wx.requestPayment⽅法会报签名错误
map.put("nonceStr", nonce_str);
map.put("package", "prepay_id=" + ("prepay_id"));
map.put("signType", "MD5");
System.out.println("⼆次签名参数: " + map);  //需要⽣成⼆次签名所⽤的参数
//再次签名sign,这个签名⽤于⼩程序端调⽤wx.requesetPayment⽅法
String sign = ateSignature(map, "key");  //你的商户号key
map.put("paySign", sign); // ⽣成签名重要
System.out.println("⽣成的签名paySign : " + sign);
       // return map; //将map响应给前端⽀付接⼝需要的参数
}
}
测试:打印结果
写文章的小程序
第⼀次签名后⽣成的数据主要是⽀付交易会话标识:prepay_id
第⼆次签名后再次组装数据返回给前端的数据  wx.requestPayment 需要接收的数据
容易遇到的错误!  容易遇到的错误!    容易遇到的错误!
  1 商户号key 不要与 appid 的secret 弄混淆了
  2 SDK ⼯具类中 Wxpay 类中 this.signType = SignType.HMACSHA256;  HMACSHA256 改成 MD5
  3 第⼆次签名需要的五个参数⼀个不能少  appId,nonceStr,package,signType,timeStamp 。注意都是以驼峰命名不然也会报错以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。