@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