springboot 微信支付里的app支付坑注意,requestPayment,支付報錯,"errMsg":"requestPayment:fail:[payment微信:-1]General errors


 

 

 

  @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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM