ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot 微信支付里的app支付坑注意,requestPayment,支付报错,"errMsg":"requestPayment:fail:[payment微

2019-12-24 18:01:20  阅读:190  来源: 互联网

标签:get 微信 System println 支付 put requestPayment data out


 

 

 

  @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

标签:get,微信,System,println,支付,put,requestPayment,data,out
来源: https://www.cnblogs.com/shanheyongmu/p/12092830.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有