設計模式-構建模式讓微信支付簡單起來

設計模式擼一遍,簡單的開始。前端

原由

最近開始在作微信支付,都知道微信支付有幾種方式,jsapi調用,掃一掃支付還有H5支付等等,我在作jsapi的時候,各類配置搞的頭疼,終於作好了,而後開始jsapi支付,想到還要搞這麼多支付,殺了我吧,頭疼,我就想能不能讓支付簡單點。git

發現


細心一看,發現仍是能夠有路口解決的,(本章只對統一下單作了處理,後續,看我能力有沒有長進了)調用的URL地址是同樣的,參數有個重要的區別,trade_type 交易類型是經過參數區分的,也就是說。只要這個參數不一樣,就能夠區別開各類支付。github

準備

熟悉了一會,微信支付官網提供的支付SDK,對裏面的調用有了解一會後,開始作準備。設計模式

1:準備支付時候的參數api

2:準備統一下單的方法(因此的都必須知足)bash

其實想一想就這麼簡單,咱們只要準備如下參數。微信支付的SDK其餘的都給咱們作好了。咱們作的是隻是更加方便用而已。微信

構造模式-Builder來的PayHouse

利用構造模式,來填充參數。從上面就知道它們的支付區分只是參數不一樣。準備兩個枚舉類app

1:區分統一下單的方法,jsapi&掃一掃ide

/**
 * 微信支付方式
 */
public enum WxPayTradeType {
    JSAPIPAY("JSAPI"),NATIVEPAY("NATIVE"),H5PAT("MWEB"), ;
    private String value;

    WxPayTradeType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
複製代碼

2:區分AIP,統一下單等(爲了後續作準備)
學習

/**
 * 微信支付API
 */
public enum PayAPIType {
    UNIFIEDORDER("UNIFIEDORDER");
    private String value;

    PayAPIType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
複製代碼

其餘的參數就都用String了。參數還有幾點要注意

1:在WXPayConfig裏面。APPID,MchID,key已經存在了

2:參數中有許多固定值,好比:fee_type標記貨幣(默認人民幣)終端IPspbill_create_ip,其實都是看需求

最後,造成的是

PayHouse payHouse = new PayHouse.Builder(new MyConfig())
        .setAttach("")
        .setOpenid("")
        .setBody("")
        .setOutTradeNo("")
        .setTotalFee("")
        .setTradeType(WxPayTradeType.JSAPIPAY)
        .setPayAPIType(PayAPIType.UNIFIEDORDER)
        .setProductId("")
        .build();複製代碼

這個負責參數。那麼執行呢?

統一性下單的unifiedorder

微信支付有不少的API,但我以爲給它們一個一個單獨開出來,單一原則。雖然不知道這個對不對,可是方便最重要。爲了之後兼容支付寶的,仍是要接口開發

public interface Unifiedorder {

    /**
     * 微信統一下單
     * @param payHouse
     * @return
     */
     public Map<String,String> PayUnifiedorder(PayHouse payHouse);

}複製代碼

實現其類,代碼以下:

public class WxUnifiedorder implements Unifiedorder {

    public Log logger = LogFactory.getLog(getClass());

    @Override
    public Map<String, String> PayUnifiedorder(PayHouse payHouse) {
        WXPay wxpay = new WXPay(payHouse.getMyConfig());
        Map<String, String> data = new HashMap<String, String>();
        if (payHouse.getDeviceInfo() != null)data.put("device_info", payHouse.getDeviceInfo());
        if (payHouse.getNonceStr() != null)data.put("nonce_str", payHouse.getNonceStr());
        if (payHouse.getBody() != null)data.put("body", payHouse.getBody());
        if (payHouse.getDetail() != null)data.put("detail", payHouse.getDetail());
        if (payHouse.getAttach() != null)data.put("attach", payHouse.getAttach());
        if (payHouse.getOutTradeNo() != null)data.put("out_trade_no", payHouse.getOutTradeNo());
        if (payHouse.getFeeType() != null)data.put("fee_type", payHouse.getFeeType());
        if (payHouse.getTotalFee() != null)data.put("total_fee", payHouse.getTotalFee());
        if (payHouse.getSpbillCreateIp() != null)data.put("spbill_create_ip", payHouse.getSpbillCreateIp());
        if (payHouse.getTimeStart() != null)data.put("time_start", payHouse.getTimeStart());
        if (payHouse.getTimeExpire() != null)data.put("time_expire", payHouse.getTimeExpire());
        if (payHouse.getGoodsTag() != null)data.put("goods_tag", payHouse.getGoodsTag());
        if (payHouse.getNotifyUrl() != null)data.put("notify_url", payHouse.getNotifyUrl());
        if (payHouse.getTradeType() != null)data.put("trade_type", payHouse.getTradeType().getValue());
        if (payHouse.getProductId() != null)data.put("product_id", payHouse.getProductId());
        if (payHouse.getLimitPay() != null)data.put("limit_pay", payHouse.getLimitPay());
        if (payHouse.getOpenid() != null)data.put("openid", payHouse.getOpenid());
        if (payHouse.getReceipt() != null)data.put("receipt", payHouse.getReceipt());
        if (payHouse.getSceneInfo() != null)data.put("scene_info", payHouse.getSceneInfo());
        try {
            Map<String, String> resp = null ;
            if (payHouse.getTradeType() == WxPayTradeType.NATIVEPAY){//掃一掃
                resp = wxpay.unifiedOrder(data);
                logger.info(resp);
                return resp ;
            }else if (payHouse.getTradeType() == WxPayTradeType.JSAPIPAY){//JSAPI
                resp = wxpay.unifiedOrder(data);
                Map<String, String> jsapipayMap = new HashMap<String, String>();
                jsapipayMap.put("appId",payHouse.getMyConfig().getAppID());
                jsapipayMap.put("timeStamp", System.currentTimeMillis()+"");
                jsapipayMap.put("nonceStr",WXPayUtil.generateNonceStr());
                jsapipayMap.put("package","prepay_id="+resp.get("prepay_id"));
                jsapipayMap.put("signType","MD5");
                jsapipayMap.put("paySign",WXPayUtil.generateSignature(jsapipayMap,payHouse.getMyConfig().getKey()));
                jsapipayMap.put("return_code",resp.get("return_code"));
                logger.info(jsapipayMap);
                return jsapipayMap ;
            }else if (payHouse.getTradeType() == WxPayTradeType.H5PAT){//尚未申請

            }
            logger.info("is null");
            return resp;
        } catch (Exception e) {
            logger.info(e);
            e.printStackTrace();
            return null;
        }
    }

}複製代碼

執行

但願能一個方法就能夠調用全部的,返回。全部在PayHouse裏面放入執行方法(後續會有改動,但願能夠經過觀察者得到最終接口)

public Map<String,String> implement(){
    Map<String,String> map = null ;
    if (payAPIType == PayAPIType.UNIFIEDORDER){//區分API
        map = new WxUnifiedorder().PayUnifiedorder(this);
    }
    return map;
}複製代碼

看看效果

下面展現出不一樣支付方式的代碼

1:JSAPI調用

String total_fee = orderGoodsDTO.getGoodsFinalPirce()*100+"";
//合成表單
PayHouse payHouse = new PayHouse.Builder(new MyConfig())
        .setAttach("")
        .setOpenid("")
        .setBody("")
        .setOutTradeNo("")
        .setTotalFee("")
        .setTradeType(WxPayTradeType.JSAPIPAY)
        .setPayAPIType(PayAPIType.UNIFIEDORDER)
        .setProductId("")
        .build();
Map<String, String> implement = payHouse.implement();
return implement ;複製代碼

2:掃一掃

String total_fee = orderGoodsDTO.getGoodsFinalPirce()*100+"";
//合成表單
PayHouse payHouse = new PayHouse.Builder(new MyConfig())
        .setAttach("")
        .setBody("")
        .setOutTradeNo("")
        .setTotalFee("")
        .setTradeType(WxPayTradeType.NATIVEPAY)
        .setPayAPIType(PayAPIType.UNIFIEDORDER)
        .setProductId("")
        .build();
Map<String, String> implement = payHouse.implement();複製代碼

返回的Map直接轉成JSON給前端就可使用,親測。(總於有篇沒有看其餘同志的博客寫的了)

謝謝你們觀看,後續會補。以爲支付是個大工程,是能夠完善我對設計模式的學習

GitHub地址:微信支付-簡單點

相關文章
相關標籤/搜索