[微信]微信支付_App支付

统一下单 、掉起支付接口、回调支付结果通知

这里将以APP支付做示例

  • 准备工作 可以下载官方的demo使用里面的辅助类

首先将你的商户号、AppID、商户秘钥啥的重要点的信息可以单独用一个类保存下来.
在这里插入图片描述


public class ConstantUtil {
	// 商户密钥
	public static String PARTNER_KEY = "你的商户秘钥";// 商户秘钥

	// 应用ID
	public static String APPID = "APPID";// AppID

	// 商户号
	public static String MCH_ID = "商户号";

	public final static String SIGN_TYPE = "MD5";// 签名加密方式
	
	// 微信统一下单接口路径
	public static String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";

}
  1. 统一下单


//这个是回调的接口url
 public final static String notify_url = "http://你的域名或者IP:8080/appWXPay/wxNotify";

    @RequestMapping(value = "/getWxPayParameters")
    @ResponseBody
    public Map<String,Object> getWxPayParameters(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //根据id查询订单号
        AppActivityRecord goodsTrade = appActivityRecordService.findOrderNo(Integer.valueOf( request.getParameter("id")));
        //我这里是根据数据库查询相应的订单信息 实际按照自己的需求来即可
        Double price = goodsTrade.getMoney(); //根据id获得订单金额
        // // 防止抓包修改订单金额造成损失
        if (price < 0) {
            map.put("stateCode",State.NO_MESSAGE_FIND.getValue());
            map.put("msg","付款金额错误!");
            return map;
        }
        //微信价格最小单位分 转换为整数
        DecimalFormat df = new DecimalFormat("#######.##");
        price = price * 100;//这里是要支付的金额 再乘以100 (注:这里微信是以分的形式) 比如:你支付的是一元 前端传给你的是 1(实际在微信是0.01元) 再由你这里 做一个乘以100的处理,到达微信即1元
        price = Math.ceil(price);
        String totalAmount= df.format(price);
        try {
            SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
           
            parameters.put("appid", ConstantUtil.APPID);//这里的appid 就是你的商户号
            parameters.put("body", "自定义");//这个是支付页的显示的字符串
            parameters.put("mch_id", ConstantUtil.MCH_ID);//这是你的商户号
            parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());//这个是随机字符创(辅助类中有)
            parameters.put("notify_url", notify_url); //请求成功返回路径
            parameters.put("out_trade_no", goodsTrade.getOrderno()); //订单号(就是你自己生成的订单号)
            parameters.put("spbill_create_ip", getIpAddr(request));//这个是IP地址
            parameters.put("total_fee", totalAmount); //单位为分 金额
            parameters.put("trade_type", "APP"); //支付类型APP(默认为APP 不做修改)
            System.out.print("=========================={金额:total_fee}:"+totalAmount);
           
            //设置签名
            String sign = PayCommonUtil.createSign("UTF-8", parameters);
            parameters.put("sign", sign);
            String requestXML = PayCommonUtil.getRequestXml(parameters);
            String result = PayCommonUtil.httpsRequest(ConstantUtil.UNIFIED_ORDER_URL, "POST", requestXML);
            System.out.print("\n统一下单:{}{}{}========>>>>>>" + result);
            if (result.equals("")) {
                logger.info("error:统一支付接口下单失败");
                //throw new Exception("error:统一支付接口下单失败");
                map.put("msg","error:统一支付接口下单失败!");
                return map;
            }
            SortedMap<Object, Object> parMap = AppWXPayController.startWXPay(result);
            //logger.debug("最终的map是:" + parMap.toString());
            if (parMap == null) {
                map.put("stateCode",State.NO_MESSAGE_FIND.getValue());
                map.put("msg","支付出现异常,请稍后重试!");
                return map;
            } 
        } catch (Exception e) {
            e.printStackTrace();
            map.put("stateCode",State.NO_MESSAGE_FIND.getValue());
            map.put("msg","程序异常");
            logger.error(e.getMessage());
            return map;
        }
        return map;
    }

2.掉起支付接口

    public static SortedMap<Object, Object> startWXPay(String result) {
        try {
            Map<String, String> map = XmlFormat.doXMLParse(result);
            String time = Long.toString(System.currentTimeMillis());
            SortedMap<Object, Object> parameterMap = new TreeMap<Object, Object>();
            parameterMap.put("appid", ConstantUtil.APPID);//依旧是你的APPID
            parameterMap.put("partnerid", ConstantUtil.MCH_ID);//你的商户号
            parameterMap.put("prepayid", map.get("prepay_id"));
            parameterMap.put("package", "Sign=WXPay");
            parameterMap.put("noncestr", PayCommonUtil.CreateNoncestr());//随机字符串
            parameterMap.put("timestamp", time);
            String sign = PayCommonUtil.createSign("UTF-8", parameterMap);
            parameterMap.put("sign", sign);
            logger.info("\t\t====>>>>>>{startWXPay方法:}二次签名后返回的数据是:" + parameterMap.toString());
            return parameterMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

3.回调(支付结果通知)

@RequestMapping("/wxNotify")
    @ResponseBody
    public void wxNotify(HttpServletRequest request, HttpServletResponse response) throws IOException, JDOMException {
        //读取参数
        InputStream inputStream;
        StringBuffer sb = new StringBuffer();
        inputStream = request.getInputStream();
        String s;
        BufferedReader in = new BufferedReader(new InputStreamReader( inputStream, "UTF-8"));
        while ((s = in.readLine()) != null) {
            sb.append(s);
        }
        in.close();
        inputStream.close();
        //解析xml成map
        Map<String, String> m = new HashMap<String, String>();
        m = XmlFormat.doXMLParse(sb.toString());
        for (Object keyValue : m.keySet()) {
            System.out.println(keyValue + "=" + m.get(keyValue));
        }
        //过滤空 设置 TreeMap
        SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
        Iterator it = m.keySet().iterator();
        while (it.hasNext()) {
            String parameter = (String) it.next();
            String parameterValue = m.get(parameter);
            String v = "";
            if (null != parameterValue) {
                v = parameterValue.trim();
            }
            packageParams.put(parameter, v);
        }

        //判断签名是否正确
        String resXml = "";

        if (PayCommonUtil.isTenpaySign("UTF-8", packageParams)) {
            if ("SUCCESS".equals((String) packageParams.get("result_code"))) {
                // 这里是支付成功
            
                String mch_id = (String) packageParams.get("mch_id"); //商户号
                String openid = (String) packageParams.get("openid");

                //String is_subscribe = (String)packageParams.get("is_subscribe");
                String out_trade_no = (String) packageParams.get("out_trade_no"); //商户订单号
                String total_fee = (String) packageParams.get("total_fee");
                String transaction_id = (String) packageParams.get( "transaction_id"); //微信支付订单号
                
                //执行自己业务逻辑
                logger.info(">>>>>>>>>支付成功");
                //通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
                resXml = "<xml>" +
                        "<return_code><![CDATA[SUCCESS]]></return_code>" +
                        "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";

			//===========================分割线===============================
			//以下便是做支付成功后的操作啦
                AppActivityRecord gt = new AppActivityRecord();
                gt.setOrderno(out_trade_no);

                //查询订单 根据订单号查询订单
                AppActivityRecord trade = appActivityRecordService.getInfo(gt);

                if (trade != null) {
                    //-----修改支付状态  交易类型  交易时间  订单状态
                    AppActivityRecord payState = new AppActivityRecord();
                    payState.setPayState(AppActivityRecord.payState_yes);
                    payState.setPayType("在线支付");
                    payState.setPaytime(new Date());
                    payState.setOrderno(out_trade_no);
                    int result = appActivityRecordService.updatePayState(payState);
                    if (result == 1) { logger.info(">>> 修改状态成功>>>\t" +result); }
                }
            } else {
                logger.info("支付失败,错误信息:" + packageParams.get("err_code"));
                resXml = "<xml>" +
                        "<return_code><![CDATA[FAIL]]></return_code>" +
                        "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
            }
        } else {
            resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" +
                    "<return_msg><![CDATA[通知签名验证失败]]></return_msg>" + "</xml> ";
            logger.info("通知签名验证失败");
        }

        //------------------------------
        //处理业务完毕
        //------------------------------
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
        out.write(resXml.getBytes());
        out.flush();
        out.close();
    }

到这里就完成了…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值