最大的坑,小程序需要两次生成sign。先来看下流程
第二个坑,第一次的appid 中 i是小写的 ,第二次要大写I 又一个坑!
看下代码 我会在代码的注释详细说明
引用
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;
代码
public Map<String, Object> WXPayOrder(HttpServletRequest httpRequest, HttpServletResponse httpResponse,
@RequestParam("out_trade_no") @ApiParam(value = "商户订单号") String out_trade_no,
@RequestHeader("token") @ApiParam(value = "权限校验") String token,
@RequestParam("productId") @ApiParam(value = "商品类型") int productId,
@RequestParam("amount") @ApiParam(value = "商品数量") int amount,
HttpServletRequest request
) throws Exception {
Users users=userService.get(redisService.getUserId(token));
Map<String, Object> map=new HashMap<>();
//如果商品类型为1 那就是向钱包充值
MyWXConfig config = new MyWXConfig();
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", productInfo.getProduct_desc());
data.put("out_trade_no", out_trade_no);//商户订单号
BigDecimal total_fee1=productInfo.getProduct_price().multiply(new BigDecimal(amount));//这个单位是元的
BigDecimal total_fee=productInfo.getProduct_price().multiply(new BigDecimal(amount).multiply(new BigDecimal("100")));//把原来单位是元的数值保存,要存入数据库
//微信那边是分所以乘100
String fee=total_fee.toString();
data.put("total_fee", fee.split("\\.")[0]);//获取非小数部分
data.put("spbill_create_ip", request.getRemoteAddr());
data.put("notify_url", "***");//回调地址
data.put("trade_type", "JSAPI"); // 此处指定支付类型 JSAPI小程序支付 NATIVE扫码支付
data.put("openid", users.getMk_openid()); // 此处指定支付类型 JSAPI小程序支付 todo 记得该
try {
Map<String, String> resp = wxpay.unifiedOrder(data);//这里是封装好的 把东西发给微信
Map<String, String> reqData=new HashMap<>();
System.out.println(resp);
logger.info(resp);
logger.info("下单成功");
String appId="***";
String timeStamp=""+System.currentTimeMillis()/1000;//返回的要是秒级别
String nonceStr=resp.get("nonce_str");
String code_url=resp.get("code_url");
String Package=resp.get("prepay_id");
String signType="MD5";
map=MapHelper.success();
map.put("total_fee",total_fee1);
map.put("appId",appId);//这里要大写
map.put("timeStamp",timeStamp);
map.put("nonceStr",nonceStr);
map.put("package","prepay_id="+Package);
map.put("signType",signType);
reqData.put("appId","**");//二次签名所用的参数
reqData.put("timeStamp",timeStamp);
reqData.put("nonceStr",nonceStr);
reqData.put("package","prepay_id="+Package);
reqData.put("signType",signType);
map.put("sign", WXPayUtil.generateSignature(reqData, "这里是key", SignType
.MD5));//第二次生成sigh 同样用封装好的
return map;
} catch (Exception e) {
e.printStackTrace();
}
return MapHelper.error();
}