微信支付-公衆號支付

接口文檔: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);
    }
相關文章
相關標籤/搜索