zoukankan      html  css  js  c++  java
  • 微信支付 支付验证签名失败 prepay_id配置问题

    jspai方式支付,页面一直报【签名验证失败】,签名验证过了没有问题,有一点错误就报【缺少参数 total_fee】,这是误报,具体原因有很多。

    原因是因为我在前台这样写的:

      package: "prepay_id=" + data.obj.package
    

     实际 【prepay_id=xxxx】应该写在后台二次签名那里:

    前台代码

    jsapi支付具体流程:

    1.统一下单、生成预支付订单

    2.后台拿着预支付订单信息进行二次加密,具体:

     String body = request.getParameter("body");
            String out_trade_no = StringUtil.getUuid();
            String total_fee = request.getParameter("price");
            String spbill_create_ip = StringUtil.getIpAddr(request);
            String notify_url = Config.UNIFIEDORDER_NOTIFY_URL_M2;
            String trade_type = "JSAPI";
            String openid = request.getParameter("openid");
    
            Map map = new HashMap();
            map.put("body", body);// 商品描述
            map.put("out_trade_no", out_trade_no);// 商户订单号
            map.put("total_fee", total_fee);// 总金额
            map.put("spbill_create_ip", spbill_create_ip);// 发起人IP地址
            map.put("notify_url", notify_url);//通知地址
            map.put("trade_type", trade_type);// 交易类型
            map.put("openid", openid);// 交易类型
    
    
            Map data = PayUtil.unifiedOrder(map);//获取到预支付订单
            Map res = PayUtil.responseCode(data);//解析错误码
            if (res.get("return_code").equals("SUCCESS")) {
                if (res.get("result_code").equals("SUCCESS")) {
                    
                    System.out.println("JSAPI统一下单成功...");
                    System.out.println("JSAPI生成前台需要的参数...");
    
                    String page_time_stamp = String.valueOf(System.currentTimeMillis()).substring(0, 10);
                    String page_prepay_id = res.get("prepay_id").toString();
                    
                    Map<String, String> pagePrams = new HashMap<>();
                    pagePrams.put("appId", Config.APP_ID);
                    pagePrams.put("timeStamp", page_time_stamp);
                    pagePrams.put("nonceStr", StringUtil.getUuid());
                    pagePrams.put("package",  "prepay_id="+page_prepay_id);
                    pagePrams.put("signType", Config.SIGN_TYPE);
                    pagePrams.put("paySign", PayUtil.generateSignature(pagePrams));
                    return new ResponseUtil(1, "统一下单成功", pagePrams);
                } else {
                    return new ResponseUtil(0, res.get("err_code_des").toString());
                }
    
            } else {
                return new ResponseUtil(0, "统一下单失败: " + data.get("return_msg"));
            }
    

      重点是红色部分,二次签名,参数名要和jssdk官网写的一致(注意大小写):

  • 相关阅读:
    PHPEXCEL使用实例
    php文件上传及mime类型大全
    此时无法停用连接。这个连接可能在用一个或多个不支持即插即用的协议,或者它是由其他用户或系统帐户初始化的。
    关于LineChart线条颜色和粗细的问题
    php读取excel类——PHPExcelReader
    windowsXP激活
    主机win7 虚拟机xp 不能上网的解决方案
    linux下载文件命令wget
    PHP 合并两个PDF成一个PDF文件利器 FPDI
    php 利用ExcelReader实现EXCEL转换成缓存
  • 原文地址:https://www.cnblogs.com/6324/p/10281798.html
Copyright © 2011-2022 走看看