微信公众号支付--错误记录

微信公众号支付调用统一下单接口时,微信返回的数据一定要二次组装再给前台,否则会有问题的,正确示范如下:

/**
     * 获取weixin支付的返回信息
     * @param payOrderId
     * @return
     */
    @Override
    public String getPayInfo(String payOrderId,String openid,String orderType) {
        //返回结果
        String res = "";
        double total_fee_money = 0;
        //0代表普通车支付,1代表活动支付
        if ("0".equals(orderType)) {

            //payOrderId即订单的id亦是订单表的主键
            Order_main omm = orderMainService.fetch(payOrderId);
            if (omm == null) {
                res = "订单不存在";
                return res;
            }
            //如果已支付状态为1的话
            if (OrderPayStatusEnum.PAYALL.getKey() == omm.getPayStatus()) {
                res = "订单已支付";
                return res;
            }
            total_fee_money = omm.getFrontMoney();
        } else {
            //clueId即Clue_main的id
            //update by zhangyi 2017-12-1
            ActivityPayRecord activityPayRecord = activitypayrecordService.fetch(payOrderId);
            if (activityPayRecord == null) {
                res = "活动定金支付记录不存在";
                return res;
            }
            //如果已支付状态为1的话
            if (1 == activityPayRecord.getPayStatus()) {
                res = "活动定金已支付";
                return res;
            }
            total_fee_money = activityPayRecord.getFrontMoney();
        }

//         double total_fee_money= 1;
        // 总金额以分为单位,不带小数点
        // 格式转换
        DecimalFormat dformat = new DecimalFormat("0");
        String totalFee = dformat.format(total_fee_money);

        if ("true".equals(config.get("isTest", ""))) {
            totalFee = "1";
        }
        // 把请求参数打包成数组
        HashMap<String, String> sParaTemp = new HashMap<String, String>();
        String body = "长城二手车";
        //订单生成的机器 IP
        String exter_invoke_ip = this.localIp();
        sParaTemp.put("appid", WeixinConfig.appid);
        sParaTemp.put("mch_id", WeixinConfig.mch_id);
        sParaTemp.put("notify_url", WeixinConfig.notify_url);
        sParaTemp.put("trade_type", WeixinConfig.trade_type);
        sParaTemp.put("sign_type", WeixinConfig.sign_type);
        sParaTemp.put("openid", openid);
        String nonce_str = String.valueOf(new Date().getTime());
        sParaTemp.put("nonce_str", WXPayUtil.generateNonceStr());
        sParaTemp.put("spbill_create_ip", exter_invoke_ip);
        sParaTemp.put("out_trade_no", payOrderId);
        sParaTemp.put("total_fee", totalFee);
        sParaTemp.put("body", body);
        sParaTemp.put("timeStamp", nonce_str);
        //add by zhangyi 付款类型 0代表普通车支付,1代表活动支付
        sParaTemp.put("attach", orderType);

        try {
            sParaTemp.put("sign", WXPayUtil.generateSignature(sParaTemp, WeixinConfig.key, WeixinConfig.sign_type));

            String reqBody = WXPayUtil.mapToXml(sParaTemp);
            String resp = wXPayRequest.requestWithoutCert(WeixinConfig.req_url, nonce_str, reqBody, WeixinConfig.connectTimeoutMs, WeixinConfig.readTimeoutMs, true);

            //验证签名是否正确
            if (WXPayUtil.isSignatureValid(WXPayUtil.xmlToMap(resp), WeixinConfig.key, WeixinConfig.sign_type)) {
                //将返参转为map
                Map<String, String> resultmap = WXPayUtil.xmlToMap(resp);
                //resultmap.put("timeStamp",nonce_str);
                //System.out.println(JSON.toJSONString(resultmap));
                //return JSON.toJSONString(resultmap);
                //return JSON.toJSONString(WXPayUtil.xmlToMap(resp).put("timeStamp",nonce_str));

                //二次签名
                String paySign = WXPayUtil.MD5("appId=" + WeixinConfig.appid + "&nonceStr=" + resultmap.get("nonce_str") + "&package=prepay_id=" + resultmap.get("prepay_id") + "&signType=MD5&timeStamp=" + nonce_str + "&key=" + WeixinConfig.key);
                //重新组装返参
                Map resultmap1 = new HashMap();
                resultmap1.put("timeStamp", nonce_str);
                resultmap1.put("nonceStr", resultmap.get("nonce_str"));
                resultmap1.put("package", "prepay_id=" + resultmap.get("prepay_id"));
                resultmap1.put("paySign", paySign);
                resultmap1.put("signType", WeixinConfig.sign_type);
                resultmap1.put("orderType", orderType);

                System.out.println(JSON.toJSONString(resultmap1));
                //将支付参数返给前端
                return JSON.toJSONString(resultmap1);
            } else {
                return "fail";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return res;
    }
时间: 2024-08-27 18:40:26

微信公众号支付--错误记录的相关文章

微信支付(微信公众号支付) [记录]

后台 先获取code code有效5min  public string GetCodeUrl(string Appid, string redirect_uri)     {         return string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&

2017-9月微信公众号支付-Java详解

微信支付源代码 在此之前,先C麻瓜藤N遍,MD官方文档一半正确一半错误.言归正传, 微信支付整体流程:微信授权登录商户的公众号--微信支付的公众号配置--统一下单--微信js调起支付页面--输入密码支付--支付成功,异步回调URL处理商户的相应业务 一.业务场景: 先看一下支付的业务场景:用户使用微信登录商户页面,点击支付按钮,调起微信支付,选择付款卡号,输入密码,完成支付,如图: 场景十分简单,不过步骤比较多,稍不注意就掉坑里了. 二.微信公众号支付的配置准备: 1)调用公众号支付,首先你得有

微信公众号支付开发全过程 --JAVA

按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的,还配了图.我还要再说一遍. 用户点击一个支付按钮-->{后台一大推处理}-->用户看到了一个输入密码的界面,包含金额等一些信息-->用户输入密码后出来一个支付成功的页面(这部分流程都是微信自己完成的,我们什么都不用做)-->返回系统自己的页面(总不能让用户一直看着一个支付完成的页面吧

微信公众号支付总结

微信公众号支付总结大致可以分为三步, 第一步获取用户授权,第二步调用统一下单接口获取预支付id,第三步H5调起微信支付的内置JS进行支付. 注意: 不得不提的是,每个公众号(公众平台),每一个APP(开放平台), 如果要进行微信支付得单独进行开通微信支付功能.开通成功后会为每一个公众号,APP 分配一个商户号.最开始没有搞清楚这层关系,导致出现类似"appid与商户号没有关联",授权时没有"scope 权限"这样的问题. 获取用户授权 String wxaccess

使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发

概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很方便的快速完成微信公众号支付的开发. 关于Magicodes.WeChat.SDK MAGICODES.WECHAT.SDK为心莱团队封装的轻量级微信SDK,现已全部开源,开源库地址为:https://github.com/xin-lai/Magicodes.WeChat.SDK 更多介绍,请关注后

微信公众号支付 js api java版本

说起来.微信支付真是一堆坑. 居然官网都没有java版本的完整代码. 就算是php版本的.还都有错误.且前后各种版本.各种文档一大堆....不停的误导开发人员. 花了一天半时间.总算实现了微信公众号支付.和pc端的微信扫码支付.其他不说了.直接给思路 本人做的是微信V3版本的微信支付.微信的官方文档中.提供的demo 只有一些工具类.这些类还是很有作用的. https://mp.weixin.qq.com/paymch/readtemplate?t=mp/business/course3_tmp

thinkphp整合系列之微信公众号支付

thinkphp整合系列之微信公众号支付 白俊遥 2016-07-17 11:26:52 PHP thinkphp 公众号支付是指在微信app中访问的页面通过js直接调起微信支付:因此页面必须是在微信中打开的:示例项目:https://github.com/baijunyao/thinkphp-bjyadmin一:设置域名登录微信公众平台:微信支付中设置支付授权目录:把域名改为自己的:注意最后是有一个斜线的 / 设置授权域名:二:导入sdk/ThinkPHP/Library/Vendor/Wei

微信公众号支付踩坑记

前两周做微信H5支付,在浏览器端用的,天真地以为app挂到公众号中也能用,结果不行>"<|||| ,只好再对接一次公众号支付,微信的支付对接下来总体感觉就是封装地不如支付宝,文档不完善,坑贼多.本文会主要关注对接过程中所遇到的问题,以及部分实现代码. 1.介绍 公众号支付(JSAPI支付)是指用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块来完成支付,适用于在公众号.朋友圈.聊天窗口等微信内完成支付的场景.注意公众号支付必须在微信环境

asp微信公众号支付回调参数入库demo详细示例

最近接的一个小项目,客户要求用asp写,微信公众号支付完成后回调入库,晚上加了会班,帮他写了一段asp微信公众号支付回调参数入库demo详细示例 sub AddData() '当本接口网络出现问题或无法返回success字符时,微信将会在30分钟内重复8次后台通知,入库时需要判断是否已经入库,避免重复数据入库 '看看记录存在了吗 dim Rs,SQL,rsf'必须声明,微信支付环境要求很高 set rsf=conn.execute ("select * from Order_Info where