@RequestMapping(value="/toPay4App",method= {RequestMethod.POST, RequestMethod.GET})
@ApiOperation(value = "去支付. 用于app")
@ApiImplicitParams({
@ApiImplicitParam(name = "money", value = "金额", required = false, paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "type",value = "类型6=一年会员", required = true,paramType = "query",dataType = "int"),
@ApiImplicitParam(name = "memberid", value = "用户id", required = true, paramType = "query", dataType = "string"),
})
public BasicMapDataRet toPay4App(
HttpServletRequest request,
@RequestParam(required = false)BigDecimal money, Integer type,@RequestParam(required = false) Integer num,Integer memberid
) throws RestMainException {
try {
BasicMapDataRet ret = new BasicMapDataRet();
//业务逻辑和校验
Map map = doUnifiedOrder(request,trade,hrRechargeOrder);
ret.setResult(BasicRet.SUCCESS);
ret.getData().put("result",map);
return ret;
}catch (Exception e){
throw new RestMainException(e);
}
}
/**
* 微信app端支付专用的 下单
* @return
* @throws Exception
*/
public Map doUnifiedOrder(HttpServletRequest request,Trade trade,HrRechargeOrder hrRechargeOrder) throws Exception {
try {
//WXConfigUtil config = new WXConfigUtil();
//System.out.println("wxPayAppConfigtoString:"+wxPayAppConfig.toString()+"字符串"+wxPayAppConfig.getKey()+"appid"+wxPayAppConfig.getAppID());
WXPay wxpay = new WXPay(wxPayAppConfig);
Map<String, String> data = new HashMap<>();
data.put("appid", wxPayAppConfig.getAppID());
//System.out.println("打印appid"+data.get("appid"));
data.put("mch_id", wxPayAppConfig.getMchID());
//System.out.println("打印mch_id"+data.get("mch_id"));
data.put("nonce_str", WXPayUtil.generateNonceStr());
//System.out.println("打印nonce_str"+data.get("nonce_str"));
data.put("body", trade.getBody());
//System.out.println("打印body"+data.get("body"));
data.put("out_trade_no", trade.getOutTradeNo());
//System.out.println("打印out_trade_no"+data.get("out_trade_no"));
data.put("total_fee",hrRechargeOrder.getMoney().multiply(new BigDecimal(100)).toString());
//data.put("total_fee",hrRechargeOrder.getMoney().toString());
//System.out.println("打印total_fee和money"+data.get("total_fee"));
//自己的服务器IP地址
data.put("spbill_create_ip", request.getRemoteAddr());
//System.out.println("打印spbill_create_ip"+data.get("spbill_create_ip"));
//异步通知地址(请注意必须是外网)
data.put("notify_url", webConfBean.getProjectDomain()+"/rest/wxpay/notify");
//System.out.println("打印notify_url"+data.get("notify_url"));
//交易类型
data.put("trade_type", "APP");
//System.out.println("打印trade_type"+data.get("trade_type"));
//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
//data.put("attach", "");
//System.out.println("进入sign前"+data.toString()+"wxPayAppConfig.getKey()"+"0ba2e528d876e0ef66ca5344debb3eac");
//System.out.println("进入sign前再次打印data"+data.toString());
data.put("sign", WXPayUtil.generateSignature(data, wxPayAppConfig.getKey(),
WXPayConstants.SignType.MD5));
//System.out.println("请求前最后打印data"+data.toString());
//使用官方API请求预付订单
Map<String, String> response = wxpay.unifiedOrder(data);
//System.out.println("打印response.get(\"return_code\")"+response.get("return_code"));
//System.out.println("打印response"+response.toString());
if ("SUCCESS".equals(response.get("return_code"))) {//主要返回以下5个参数
//System.out.println("进入success");
Map<String, String> param = new HashMap<>();
param.put("appid",wxPayAppConfig.getAppID());
param.put("partnerid",response.get("mch_id"));
param.put("prepayid",response.get("prepay_id"));
param.put("package","Sign=WXPay");
param.put("noncestr",WXPayUtil.generateNonceStr());
param.put("timestamp",System.currentTimeMillis()/1000+"");
param.put("sign",WXPayUtil.generateSignature(param, wxPayAppConfig.getKey(),
WXPayConstants.SignType.MD5));
//System.out.println("进入第二次sign"+param.get("sign"));
return param;
}
} catch (Exception e) {
e.printStackTrace();
throw new MyException("下单失败");
}
throw new MyException("下单失败");
}
最大的坑在加红的位置,引入用的@Value 不用
@Component
@ConfigurationProperties("mod.wechat.pay")
①原因在于不支持驼峰的会空指针
②另外一个坑在于 app支付不同于PC和H5的JSAPI和NATIVE它需要二次验签名,而H5和PC的可以直接request和result