微信支付-公众号支付

接口文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1php

前期准备

一、设置支付目录

二、设置网页受权域名

统一下单接口

URL地址:https://api.mch.weixin.qq.com/pay/unifiedorderjava

一、建立统计下单方法:api

//微信支付统一下单接口地址
private static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";微信

/**
     * 微信公众号支付
     * @param body 商品描述
     * @param outTradeNo 订单号
     * @param totalFee 总金额 分
     * @param spbillCreateIp ip地址
     * @param openid
     * @param setBean 微信公众号的配置参数
     * @return
     */
    public static Map<String,String> unifiedorderOfJSPAI(String body, String outTradeNo, Integer totalFee, String spbillCreateIp, String openid, SetBean setBean){
        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", setBean.getAppId());//公众号的appid
        params.put("mch_id", setBean.getMchId());//公众号的商户id
        params.put("body", body);//商品简单描述
        params.put("spbill_create_ip", spbillCreateIp);//用户端ip
        params.put("out_trade_no", outTradeNo);//系统订单号
        params.put("total_fee", String.valueOf(totalFee));//支付总金额 单位是分
        params.put("trade_type","JSAPI");
        params.put("nonce_str",  System.currentTimeMillis() / 1000 + "");//随机字符串
        params.put("notify_url", setBean.getNotifyUrl());//支付成功后的通知地址
        params.put("openid", openid);//支付用户的微信openid
        String sign=createSign(params,setBean.getPayKey());//签名
        params.put("sign",sign);
        String xmlResult= HttpKit.post(unifiedOrderUrl,toXml(params));//获取统一下单结果
        Map<String, String> result = xmlToMap(xmlResult);
        return result;
        //返回的map
//        nonce_str    X2VWhQqd0JhDwxXR
//        appid    wxbXXXXXXXXXXXXXXXXX
//        sign    B0A62A1BD2DCC1953B3681D7ED0F848C
//        trade_type    JSAPI
//        return_msg    OK
//        result_code    SUCCESS
//        mch_id    123525252
//        return_code    SUCCESS
//        prepay_id    wx20170502102940927faccf9d123456789
    }

生成微信要求的签名:app

/**
     * 组装签名的字段
     * @param params 参数
     * @return String
     */
    private static String packageSign(Map<String, String> params) {
        // 先将参数以其参数名的字典序升序进行排序
        TreeMap<String, String> sortedParams = new TreeMap<String, String>(params);
        // 遍历排序后的字典,将全部参数按"key=value"格式拼接在一块儿
        StringBuilder sb = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String, String> param : sortedParams.entrySet()) {
            String value = param.getValue();
            if (StrKit.isBlank(value)) {
                continue;
            }
            if (first) {
                first = false;
            } else {
                sb.append("&");
            }
            sb.append(param.getKey()).append("=");
            sb.append(value);
        }
        return sb.toString();
    }

    /**
     * 生成签名
     * @param params 参数
     * @param payKey 支付密钥
     * @return sign
     */
    public static String createSign(Map<String, String> params, String payKey) {
        // 生成签名前先去除sign
        params.remove("sign");
        String stringA = packageSign(params);
        String stringSignTemp = stringA + "&key=" + payKey;
        return HashKit.md5(stringSignTemp).toUpperCase();
    }
@RequestMapping("notify")
    public String notifyScan(HttpServletRequest request){
        String xmlMsg = HttpKit.readData(request);
        System.out.println("支付通知="+xmlMsg);
        Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
        String result_code  = params.get("result_code");
        // 总金额
        String totalFee     = params.get("total_fee");
        // 商户订单号
        String out_trade_no      = params.get("out_trade_no");
        // 微信支付订单号
        String transId      = params.get("transaction_id");

        String openid=params.get("openid");

        // 支付完成时间,格式为yyyyMMddHHmmss
        String timeEnd      = params.get("time_end");
        SetBean setBean=settingService.getConfig();
        if (PaymentKit.verifyNotify(params, setBean.getPayKey())){
            if (("SUCCESS").equals(result_code)) {
                //更新订单信息
                System.out.println("更新订单信息");
         
                   }
                }


                Map<String, String> xml = new HashMap<String, String>();
                xml.put("return_code", "SUCCESS");
                xml.put("return_msg", "OK");
                return (PaymentKit.toXml(xml));
            }
        }
        return "";
    }


   /**
     * 支付异步通知时校验sign
     * @param params 参数
     * @param paternerKey 支付密钥
     * @return {boolean}
     */
    public static boolean verifyNotify(Map<String, String> params, String paternerKey){
        String sign = params.get("sign");
        String localSign = PaymentKit.createSign(params, paternerKey);
        return sign.equals(localSign);
    }
相关文章
相关标签/搜索