微信支付

1.本地生成购币订单

        /**
         * 1.生成购币订单
         */
        String orderNumber = BaseSettings.getOrderNumber();
        PersonOrderEntity personOrderEntity = new PersonOrderEntity();
        personOrderEntity.setOrdernumber(orderNumber);
        personOrderEntity.setPersonidcard(idcard);
        personOrderEntity.setMoney(new BigDecimal(money));
        personOrderEntity.setAmount(Integer.valueOf(amount));
        personOrderEntity.setLastamount(Integer.valueOf(amount));
        personOrderEntity.setOrderstatus(0);
        personOrderEntity.setPaytype(2);
        personOrderEntity.setCreatetime(new Date());
        personOrderEntity.setPersonname(person.getName());
        personOrderEntity.setPersontel(person.getTel());
        int insertSelective = baseEntityMapper.insertSelective(personOrderEntity);
        if (insertSelective == 0) {
            logger.info("微信支付(插入订单为null) :"+BaseSettings.Validate.生成微信支付订单失败.getMsg()+", idcard:"+idcard+", money:"+money+", amount:"+amount);
            return r.setStatus(R.STATUS_ERROR)
                    .setStatusMsg(BaseSettings.Validate.生成微信支付订单失败.getMsg())
                    .setStatusCode(BaseSettings.Validate.生成微信支付订单失败.getCode());
        }

2.调用微信接口

        //对以下字段进行签名
        SortedMap<String, String> packageParams = new TreeMap();
        packageParams.put("appid", WechatConfig.appid);
        packageParams.put("attach", attach);
        packageParams.put("body", body);
        packageParams.put("mch_id", mch_id);
        packageParams.put("nonce_str", nonce_str);
        packageParams.put("notify_url", notify_url);
        packageParams.put("out_trade_no", out_trade_no);
        packageParams.put("spbill_create_ip", spbill_create_ip);
        packageParams.put("total_fee", total_fee);
        packageParams.put("trade_type", trade_type);
        RequestHandler reqHandler = new RequestHandler(request, response);
        reqHandler.init(WechatConfig.appid, WechatConfig.appsecret, WechatConfig.partnerkey);
        String sign = reqHandler.createSign(packageParams);//获取签名

        String xml = "<xml>" +
                "<appid>" + WechatConfig.appid + "</appid>" +
                "<attach>" + attach + "</attach>" +
                "<body><![CDATA[" + body + "]]></body>" +
                "<mch_id>" + mch_id + "</mch_id>" +
                "<nonce_str>" + nonce_str + "</nonce_str>" +
                "<notify_url>" + notify_url + "</notify_url>" +
                "<out_trade_no>" + out_trade_no + "</out_trade_no>" +
                "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" +
                "<total_fee>" + total_fee + "</total_fee>" +
                "<trade_type>" + trade_type + "</trade_type>" +
                "<sign>" + sign + "</sign>" +
                "</xml>";
        String allParameters = reqHandler.genPackage(packageParams);
        String createOrderURL = WechatConfig.createOrderURL;
        String prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);
        if (StringUtils.isEmpty(prepay_id)) {
            //事务回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            logger.info("微信支付(微信返回prepay_id为null) :"+BaseSettings.Validate.生成微信支付订单失败.getMsg()+", idcard:"+idcard+", money:"+money+", amount:"+amount);
            return r.setStatus(R.STATUS_ERROR)
                    .setStatusMsg(BaseSettings.Validate.调用微信接口返回prepay_id.getMsg())
                    .setStatusCode(BaseSettings.Validate.调用微信接口返回prepay_id.getCode());
        }

        //获取到prepayid后对以下字段进行签名最终发送给app
        SortedMap<String, String> finalpackage = new TreeMap<String, String>();
        String timestamp = Sha1Util.getTimeStamp();
        finalpackage.put("appid", WechatConfig.appid);
        finalpackage.put("timestamp", timestamp);
        finalpackage.put("noncestr", nonce_str);
        finalpackage.put("partnerid", WechatConfig.partner);
        finalpackage.put("package", "Sign=WXPay");
        finalpackage.put("prepayid", prepay_id);
        String finalsign = reqHandler.createSign(finalpackage);

        Map<String, Object> maps = new HashMap();
        maps.put("msg", WechatConfig.wx_msg);
        maps.put("appid", WechatConfig.appid);
        maps.put("timestamp", timestamp);
        maps.put("noncestr", nonce_str);
        maps.put("partnerid", WechatConfig.partner);
        maps.put("prepayid", prepay_id);
        maps.put("package", WechatConfig.wx_package);
        maps.put("sign", finalsign);

        logger.info("微信支付 :"+BaseSettings.Validate.生成微信支付订单失败.getMsg()+", idcard:"+idcard+", money:"+money+", amount:"+amount);
        return r.setData(maps).setStatus(R.STATUS_SUCCESS)
                .setStatusMsg(BaseSettings.Validate.生成微信支付订单成功.getMsg())
                .setStatusCode(BaseSettings.Validate.生成微信支付订单成功.getCode());

3.异步通知

 public String saveWechatNotice(HttpServletRequest request, HttpServletResponse response) throws Exception {

        response.setHeader("Access-Control-Allow-Origin", "*");
        InputStream in = request.getInputStream();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        out.close();
        in.close();
        String msgxml = new String(out.toByteArray(), "utf-8");//xml数据

        Map map = new GetWxOrderno().doXMLParse(msgxml);
        String result_code = (String) map.get("result_code");
        String out_trade_no = (String) map.get("out_trade_no");
        String total_fee = (String) map.get("total_fee");
        String sign = (String) map.get("sign");
        Double amount = new Double(total_fee) / 100; //获取订单金额
        String attach = (String) map.get("attach");
        String sn = out_trade_no.split("\\|")[0]; //获取订单编号

        if (result_code.equals("SUCCESS")) {

            //总金额以分为单位,不带小数点
            String fee_type = (String) map.get("fee_type");
            String bank_type = (String) map.get("bank_type");
            String cash_fee = (String) map.get("cash_fee");
            String is_subscribe = (String) map.get("is_subscribe");
            String nonce_str = (String) map.get("nonce_str");
            String openid = (String) map.get("openid");
            String return_code = (String) map.get("return_code");
            String sub_mch_id = (String) map.get("sub_mch_id");
            String time_end = (String) map.get("time_end");
            String trade_type = (String) map.get("trade_type");
            String transaction_id = (String) map.get("transaction_id");
            //需要对以下字段进行签名
            SortedMap<String, String> packageParams = new TreeMap();
            packageParams.put("appid", WechatConfig.appid);
            packageParams.put("attach", ""); //用自己系统的数据:会员id
            packageParams.put("bank_type", bank_type);
            packageParams.put("cash_fee", cash_fee);
            packageParams.put("fee_type", fee_type);
            packageParams.put("is_subscribe", is_subscribe);
            packageParams.put("mch_id", WechatConfig.partner);
            packageParams.put("nonce_str", nonce_str);
            packageParams.put("openid", openid);
            packageParams.put("out_trade_no", out_trade_no);
            packageParams.put("result_code", result_code);
            packageParams.put("return_code", return_code);
            packageParams.put("sub_mch_id", sub_mch_id);
            packageParams.put("time_end", time_end);
            packageParams.put("total_fee", total_fee);    //用自己系统的数据:订单金额
            packageParams.put("trade_type", trade_type);
            packageParams.put("transaction_id", transaction_id);

            RequestHandler reqHandler = new RequestHandler(request, response);
            reqHandler.init(WechatConfig.appid, WechatConfig.appsecret, WechatConfig.partnerkey);
            String endsign = reqHandler.createSign(packageParams);

            if (sign.equals(endsign)) {//验证签名是否正确  官方签名工具地址:https://pay.weixin.qq.com/wiki/tools/signverify/
                //支付成功
                String orderNumber = out_trade_no;

                //查询订单号的真实性 @add alex 2017-09-27
                Map<String, Object> condition = new HashMap();
                condition.put("orderNumber", orderNumber);
                PersonOrderEntity personOrders = baseEntityMapper.selectOrderIdByMessage(condition);
                if (personOrders == null || personOrders.getOrderstatus() == 1) {
                    return setXml("FALSE", "OK");
                }

//                AMQMSG amqmsg = new AMQMSG();
                PersonOrderEntity personOrderEntity = new PersonOrderEntity();
                personOrderEntity.setOrdernumber(orderNumber);
                personOrderEntity.setOrderstatus(1);
                personOrderEntity.setCompletetime(new Date());
//                amqmsg.setOperate(AMQConfig.AMQ_OPT_UPDATE);
//                amqmsg.setTablename(AMQConfig.AMQ_TABLE_PERSONORDER);
//                amqmsg.setData(personOrderEntity);
//                queueProducer.sendMessage(amqmsg.toString());
                int update = baseEntityMapper.updateByOrdernumber(personOrderEntity);
                if (update == 0) {
                    return setXml("FALSE", "OK");
                }

                //redis
                String idcard = personOrders.getPersonidcard();
//                Integer lastAmount = (Integer) redisTemplate.opsForValue().get(BaseSettings.REDIS_PERSON_AMOUNT_PREX + idcard);
                Integer lastAmount =redisDao.getLastAmount(idcard);
                if (lastAmount == null) {
                    lastAmount = 0;
                }
//                redisTemplate.opsForValue().set(BaseSettings.REDIS_PERSON_AMOUNT_PREX + idcard, lastAmount + personOrders.getLastamount());
                redisDao.setLastAmount(idcard,lastAmount + personOrders.getLastamount());

            }

        }

        return setXml("SUCCESS", "OK");
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是饭七分饱

生活在阴沟,也得仰望星空

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值