設計模式擼一遍,簡單的開始。前端
最近開始在作微信支付,都知道微信支付有幾種方式,jsapi調用,掃一掃支付還有H5支付等等,我在作jsapi的時候,各類配置搞的頭疼,終於作好了,而後開始jsapi支付,想到還要搞這麼多支付,殺了我吧,頭疼,我就想能不能讓支付簡單點。git
細心一看,發現仍是能夠有路口解決的,(本章只對統一下單作了處理,後續,看我能力有沒有長進了)調用的URL地址是同樣的,參數有個重要的區別,trade_type 交易類型是經過參數區分的,也就是說。只要這個參數不一樣,就能夠區別開各類支付。github
熟悉了一會,微信支付官網提供的支付SDK,對裏面的調用有了解一會後,開始作準備。設計模式
1:準備支付時候的參數api
2:準備統一下單的方法(因此的都必須知足)bash
其實想一想就這麼簡單,咱們只要準備如下參數。微信支付的SDK其餘的都給咱們作好了。咱們作的是隻是更加方便用而已。微信
利用構造模式,來填充參數。從上面就知道它們的支付區分只是參數不一樣。準備兩個枚舉類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();複製代碼
這個負責參數。那麼執行呢?
微信支付有不少的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給前端就可使用,親測。(總於有篇沒有看其餘同志的博客寫的了)
謝謝你們觀看,後續會補。以爲支付是個大工程,是能夠完善我對設計模式的學習