@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
參考博客 https://www.jianshu.com/p/59baa5a280b7