微信支付工具類 小程序 掃碼

1.maven導入wxpay-sdk-3.0.9

    <dependency>
        <groupId>com.github.wxpay</groupId>
        <artifactId>wxpay-sdk</artifactId>
        <version>3.0.9</version>
    </dependency>

sdk下載地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

注:下載後請自行打成jar包

2.新建WxConfig 繼承sdk裏面的WXPayConfig

package com.liaoin.tourism.config;

import com.github.wxpay.sdk.*;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class WxConfig extends WXPayConfig {

    private byte[] certData;
	//如不需要更換appID就直接寫死 例:private String toAppId = "xxxxxx";
    private String toAppId;

    public String getToAppId() {
        return toAppId;
    }

    public void setToAppId(String toAppId) {
        this.toAppId = toAppId;
    }

    public String getAppID() {
        return toAppId;
    }
	
	// 支付商戶平臺的商戶id
    public String getMchID() {
        return "xxxx";
    }
	
    public String getKey() {
        return "xxxx";
    }

    public WxConfig() throws Exception { // 構造方法讀取證書, 通過getCertStream 可以使sdk獲取到證書
        String certPath = "C:\\Users\\admin\\Desktop\\xxx\\pay\\1500120982_20200407_cert/apiclient_cert.p12";
        File file = new File(certPath);
        InputStream certStream = new FileInputStream(file);
        this.certData = new byte[(int) file.length()];
        certStream.read(this.certData);
        certStream.close();
    }

    @Override
    public InputStream getCertStream() {
        return new ByteArrayInputStream(this.certData);
    }

    @Override
    public IWXPayDomain getWXPayDomain() { // 這個方法需要這樣實現, 否則無法正常初始化WXPay
        IWXPayDomain iwxPayDomain = new IWXPayDomain() {
            @Override
            public void report(String domain, long elapsedTimeMillis, Exception ex) {

            }
            @Override
            public DomainInfo getDomain(WXPayConfig config) {
                return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
            }
        };
        return iwxPayDomain;
    }


    public int getHttpConnectTimeoutMs() {
        return 8000;
    }

    public int getHttpReadTimeoutMs() {
        return 10000;
    }
}

3.新建WxPayUtil工具類

package com.liaoin.tourism.util;

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.liaoin.tourism.business.tourismOrder.parameter.IcbcParameter;
import com.liaoin.tourism.common.constant.VariableConstants;
import com.liaoin.tourism.config.WxConfig;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

@Slf4j
public class WxPayUtil {

    public static WXPay getWXPay(String appId) {
        WxConfig config;
        WXPay wxpay = null;
        try {
            config = new WxConfig();
            config.setToAppId(appId);
            wxpay = new WXPay(config);
        } catch (Exception e) {
            log.error("WXPay初始化失敗.");
            e.printStackTrace();
        }
        return wxpay;
    }

    public static WxConfig getWxConfig(String appId) {
        WxConfig config = null;
        try {
            config = new WxConfig();
            config.setToAppId(appId);
        } catch (Exception e) {
            log.error("獲取WxConfig失敗.");
            e.printStackTrace();
        }
        return config;
    }


    //微信回調地址
    public static final String wxNotifyUrlServlet = "www.baidu.com";
    /**
     * 小程序下單
     *
     *                 @param
     *                 data.put("body", "騰訊充值中心-QQ會員充值");
     *                 data.put("out_trade_no", "test2020090910595900000012");
     *                 data.put("device_info", "WEB");
     *                 data.put("fee_type", "CNY");
     *                 data.put("total_fee", "1");
     *                 data.put("spbill_create_ip", "58.17.241.195");
     *                 data.put("notify_url", "http://www.example.com/wxpay/notify");
     *                 data.put("trade_type", "JSAPI");  // 此處指定爲掃碼支付
     *                 data.put("product_id", "12");
     * @return
     */
    public static Map<String, String> createMiniProgramTradePay(Integer datasorce,String orderType,String body,String outTradeNo,String total_fee,String ip,String openid) {
        WXPay wxPay = null;
        WxConfig wxConfig = null;
        Map<String, String> payParam = new HashMap<String, String>();
        payParam.put("body", body);//"測試織金洞微信支付"
        payParam.put("out_trade_no", outTradeNo);//"test2020090910595900000012"
        payParam.put("device_info", "WEB");
        payParam.put("fee_type", "CNY");
        payParam.put("total_fee", total_fee); //"1"
        payParam.put("spbill_create_ip", ip);//"58.17.241.195"
        payParam.put("notify_url", wxNotifyUrlServlet); // 回調地址
        if (datasorce == 1){
            payParam.put("trade_type", "NATIVE");  // 此處指定爲掃碼支付
        }else{
            payParam.put("trade_type", "JSAPI");  // 此處指定爲掃碼支付
        }
        payParam.put("product_id", "12");
        payParam.put("openid",openid);//"oTZW-4jVzZ3GnvfNtbwv8TPhI5K8"
        payParam.put("attach","2"); // 附加信息
        String tpAppId = getWxAppId(orderType);
        if (tpAppId != null){
            payParam.put("appid",tpAppId); //應用的appId
            wxPay = getWXPay(tpAppId);
            wxConfig = getWxConfig(tpAppId);
        }

        Map<String, String> result = new HashMap<>();
        try {
            Map<String, String> resp = wxPay.unifiedOrder(payParam);
            log.info("微信支付下單成功, 返回值 response={}", resp);
            String returnCode = resp.get("return_code");
            if (!"SUCCESS".equals(returnCode)) {
                return null;
            }
            String resultCode = resp.get("result_code");
            if (!"SUCCESS".equals(resultCode)) {
                return null;
            }
            String prepay_id = resp.get("prepay_id");
            if (prepay_id == null) {
                return null;
            }
            if (datasorce == 1){
                String code_url = resp.get("code_url");
                if (code_url !=null){
                    Map<String,String> qrcode = new HashMap<>();
                    qrcode.put("qrcode",code_url);
                    return qrcode;
                }
            }
            // ******************************************
            //  前端調起微信支付必要參數
            // ******************************************
            String packages = "prepay_id=" + prepay_id;
            Map<String, String> wxPayMap = new HashMap<String, String>();
            wxPayMap.put("appId", wxConfig.getAppID());
            wxPayMap.put("timeStamp", String.valueOf(System.currentTimeMillis()));
            wxPayMap.put("nonceStr", StringUtil.generateRandomCode(false, 6));
            wxPayMap.put("package", packages);
            wxPayMap.put("signType", "MD5");

            // 加密串中包括 appId timeStamp nonceStr package signType 5個參數, 通過sdk WXPayUtil類加密, 注意, 此處使用  MD5加密  方式
            String sign = WXPayUtil.generateSignature(wxPayMap, wxConfig.getKey());
            // ******************************************
            //  返回給前端調起微信支付的必要參數
            // ******************************************
            result.put("prepay_id", prepay_id);
            result.put("paySign", sign);
            result.putAll(wxPayMap);
        } catch (Exception e) {
            log.error("微信下單失敗.  Method:{},訂單號:{}", "createMiniProgramTradePay", payParam.get("out_trade_no"));
            e.printStackTrace();
        }
        return result;
    }

    public static Map<String,String> closeOrder(String outTradeNo){
        WXPay wxpay = getWXPay("");
        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", outTradeNo);
        try {
            Map<String, String> resp = wxpay.closeOrder(data);
            return resp;
        } catch (Exception e) {
            log.error("微信關閉訂單失敗. Method:{},訂單號:{}", "closeOrder", outTradeNo);
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 訂單查詢
     *
     * @param outTradeNo
     * @return
     */
    public static Map<String, String> orderQuery(String orderType,String outTradeNo) {
        WXPay wxpay = getWXPay(getWxAppId(orderType));
        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", outTradeNo);
        try {
            Map<String, String> resp = wxpay.orderQuery(data);
            return resp;
        } catch (Exception e) {
            log.error("微信訂單號查詢失敗. Method:{},訂單號:{}", "orderQuery", outTradeNo);
            e.printStackTrace();
        }
        return null;
    }

    public static Boolean orderQueryState(String orderType,String outTradeNo){
        WXPay wxpay = getWXPay(getWxAppId(orderType));
        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", outTradeNo);
        try {
            Map<String, String> resp = wxpay.orderQuery(data);
            if (resp.get("trade_state") == null || !resp.get("trade_state").equalsIgnoreCase("SUCCESS")){
                return false;
            }
            return true;
        } catch (Exception e) {
            log.error("微信訂單號查詢失敗. Method:{},訂單號:{}", "orderQuery", outTradeNo);
            e.printStackTrace();
        }
        return false;
    }


    /**
     * 退款查詢
     *
     * @param outTradeNo
     * @return
     */
    public static Map<String, String> refundQuery(String outTradeNo) {
        WXPay wxpay = getWXPay("");
        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", outTradeNo);
        try {
            Map<String, String> resp = wxpay.refundQuery(data);
            return resp;
        } catch (Exception e) {
            log.error("微信退款查詢失敗. Method:{},訂單號:{}", "refundQuery", outTradeNo);
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 退款接口
     * @param outTradeNo 訂單號
     * @param outRefundNo 退款號
     * @param refundFee 退款金額
     * @return
     */
    public static  Map<String, String> refund(String outTradeNo,String outRefundNo,String refundFee,String notifyUrl){
        WXPay wxpay = getWXPay("");
        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", outTradeNo);
        data.put("out_refund_no", outRefundNo);
        data.put("refund_fee", refundFee);
        data.put("notify_url", notifyUrl);
        try {
            Map<String, String> resp = wxpay.refund(data);
            return resp;
        } catch (Exception e) {
            log.error("微信退款查詢失敗. Method:{},訂單號:{},退款單號:{}", "refund", outTradeNo,outRefundNo);
            e.printStackTrace();
        }
        return null;
    }

    public static String getWxAppId(String orderType){
        String tpAppId = VariableConstants.STRING_CONSTANT_1.equals(orderType)||VariableConstants.STRING_CONSTANT_2.equals(orderType)||VariableConstants.STRING_CONSTANT_3.equals(orderType)?
                IcbcParameter.hotelAppId:
                VariableConstants.STRING_CONSTANT_5.equals(orderType)?IcbcParameter.distributionAppId:
                        VariableConstants.STRING_CONSTANT_4.equals(orderType)?IcbcParameter.mallAppId:null;
       return tpAppId;

    }



    public static void main(String arg[]) {
//        Map<String, String> data = new HashMap<String, String>();
//        data.put("body", "測試微信支付");
//        data.put("out_trade_no", "test2020090910595900000012");
//        data.put("device_info", "WEB");
//        data.put("fee_type", "CNY");
//        data.put("total_fee", "1");
//        data.put("spbill_create_ip", "58.17.241.195");
//        data.put("notify_url", "http://www.example.com/wxpay/notify");
//        data.put("trade_type", "NATIVE");  // 此處指定爲掃碼支付
//        data.put("product_id", "12");
//        data.put("openid","oTZW-4jVzZ3GnvfNtbwv8TPhI5K8");
        // 測試下單接口
       createMiniProgramTradePay(1,"2","測試微信掃碼支付","test2020090910595900120012","1","58.17.241.195","oTZW-4jVzZ3GnvfNtbwv8TPhI5K8");
       // 測試查詢接口
        orderQueryState("3","1249895377172303872");
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章