github 地址:https://github.com/alansun2/happyframework-pay
開發(fā)項(xiàng)目必須為spring項(xiàng)目
1. 使用
1.1. 如何集成到項(xiàng)目中惑惶?
-
git clone 此項(xiàng)目择懂,進(jìn)入目錄癌椿,使用以下 maven 命令打成 jar 包:
mvn clean install
相應(yīng)的在 pom.xml 中加入如下依賴:
<dependency> <groupId>com.alan344</groupId> <artifactId>happyframework-pay</artifactId> <version>1.5.0-SNAPSHOT</version> </dependency>
把
@EnablePay
注解放到有 @SpringBootApplication/@Configuration 的地方;-
把以下內(nèi)容,放入
application.properties/yml
并修改為你自己的微信或支付寶信息即可(有默認(rèn)值的可以不填);pay: alipay: app-id: ggg #應(yīng)用appid private-key: ccc #商戶的私鑰。表示一個(gè)路徑缰猴,示例:/root/a/private-key gateway-url: ggg #選填。 默認(rèn):https://openapi.alipay.com/gateway.do open-public-key: eee #開放平臺(tái)支付寶公鑰 表示一個(gè)路徑疤剑,示例:/root/a/private-key notify-url: fff #支付回調(diào)地址 input-charset: aaa #選填滑绒,默認(rèn):UTF-8 sign-type: bbb #選填,默認(rèn):RSA2 time-out: 默認(rèn):30m wechat: spbill-create-ip: bbb #調(diào)用接口的ip notify-url: ddd #微信支付回調(diào)地址 mch-app-id-map: #與商戶號(hào)綁定的appid或小程序appid隘膘,默認(rèn)使用第一個(gè)支付 1: ddd 2: eee mch-map: #商戶號(hào)信息疑故,默認(rèn)第一個(gè)為primary 1: mch-id: fff #商戶號(hào) public-key: ggg #微信RSA公鑰。表示一個(gè)路徑弯菊,示例:/root/a/private-key sign-key: hhh #用戶md5簽名纵势。表示一個(gè)路徑,示例:/root/a/private-key ca: iii #ca證書地址管钳。表示一個(gè)路徑钦铁,示例:/root/a/private-key ca-code: jjj #ca證書的密匙。表示一個(gè)路徑才漆,示例:/root/a/private-key 2: mch-id: fff #商戶號(hào) public-key: ggg #微信RSA公鑰牛曹。表示一個(gè)路徑,示例:/root/a/private-key sign-key: hhh #用戶md5簽名醇滥。表示一個(gè)路徑黎比,示例:/root/a/private-key ca: iii #ca證書地址。表示一個(gè)路徑鸳玩,示例:/root/a/private-key ca-code: jjj #ca證書的密匙阅虫。表示一個(gè)路徑,示例:/root/a/private-key
alipay:
- app-id: 應(yīng)用appid
- sign-type: 支付寶推薦使用RSA2不跟,這里不填默認(rèn)RSA2
- private-key: 商戶的私鑰书妻。表示一個(gè)路徑,示例:/root/a/private-key
- open-public-key:開放平臺(tái)支付寶公鑰 表示一個(gè)路徑躬拢,示例:/root/a/private-key
- notify-url: fff #支付的默認(rèn)回調(diào)地址,包括app见间,掃碼等
你需要填寫的主要有:app-id聊闯,private-key,open-public-key米诉,notify-url
wechat:
- spbill-create-ip: 調(diào)用接口的ip
- notify-url: ddd #微信支付回調(diào)地址
- mch-app-id-map: 與商戶號(hào)綁定的appid或小程序appid菱蔬,主要用于轉(zhuǎn)賬到微信零錢,默認(rèn)使用第一個(gè)appid進(jìn)行支付,退款拴泌,查詢訂單
該屬性為一個(gè)map魏身,key為
Integer
,value為String
- mch-map: 商戶號(hào)信息蚪腐,默認(rèn)第一個(gè)為primary
該屬性為一個(gè)map箭昵,key為
Integer
,value為WechatMch
- mch-id: 商戶號(hào)
- public-key: 微信RSA公鑰回季。表示一個(gè)路徑家制,示例:/root/a/private-key
- sign-key: 用戶md5簽名。表示一個(gè)路徑泡一,示例:/root/a/private-key
- ca: ca證書地址颤殴。表示一個(gè)路徑,示例:/root/a/private-key
- ca-code: ca證書的密匙鼻忠。表示一個(gè)路徑涵但,示例:/root/a/private-key
1.2. 如何使用
-
PayUtils
:支持支付、退款帖蔓、查詢訂單操作 -
TransferAccountsUtils
:支持轉(zhuǎn)賬操作(包括轉(zhuǎn)賬到零錢和銀行卡(支付寶未開放轉(zhuǎn)賬到銀行卡接口))
2. 使用示例
2.1. 支付
支付寶
OrderPay order = new OrderPay();
order.setBody("肥仔快樂水");
order.setPrice("3.25");
order.setSubject("盒馬生鮮");
order.setOrderId("sadfasdfas234234");
PayUtils.createPayInfo(order);
微信
OrderPay order = new OrderPay();
order.setBody("肥仔快樂水");
order.setPrice("3.25");
order.setOrderId("sadfasdfas234234");
order.setPayType(PayBase.PAY_TYPE_2);
// tradeType 默認(rèn)是 APP矮瘟,如果要使用小程序支付,需要修改
orderPay.setTradeType(BaseConstants.OS_WX == os ? TradeTypeEnum.APPLET : TradeTypeEnum.APP);
// 小程序支付需要設(shè)置 openid
orderPay.getWechatPayOrder().setOpenid(request.getOpenId());
// 選擇你配置文件中配置的商戶號(hào)對(duì)應(yīng)的序號(hào)讨阻,也就是說芥永,你可以配置多個(gè)商戶號(hào)信息來選擇,默認(rèn):1
orderPay.getWechatPayOrder().setMchNo(1);
PayUtils.createPayInfo(order);
或者 body 可以使用 bodyProducts 來設(shè)置钝吮,如下:
OrderPay order = new OrderPay();
order.setBodyProducts(bodyProducts);
...
...
PayUtils.createPayInfo(order);
使用 bodyProducts 的前提是 bodyProducts 必須實(shí)現(xiàn) Product 接口埋涧。notify_url 只要在上面的配置文件中配置了,這里就不需要設(shè)置了奇瘦。
另外對(duì)于支付寶/微信的回調(diào)棘催,這里我也做了簡單的封裝,你需要做的就是實(shí)現(xiàn) ConcretePayService 寫你的業(yè)務(wù)邏輯就可以了耳标。具體的做法:
/**
* 支付寶回調(diào)
*
* @param request re
*/
@PostMapping(value = "verifyAlipayCallback")
public void verifyAlipayCallback(HttpServletRequest request, HttpServletResponse response) {
AlipayCallbackHandler.getInstance().handler(request, response, sysConfig.getProfile().equals("pro"), payService);
}
/**
* 微信回調(diào)
*
* @param request re
*/
@PostMapping(value = "verifyWXPayCallback")
public void verifyWXPayCallback(HttpServletRequest request, HttpServletResponse response) {
WechatCallbackHandler.getInstance().handler(request, response, sysConfig.getProfile().equals("pro"), payService);
}
上面的例子中 payService 實(shí)現(xiàn)了 ConcretePayService 接口醇坝。
2.2. 查詢支付狀態(tài)
當(dāng)前端調(diào)起支付并支付成功后,前端可以調(diào)用后臺(tái)的該接口來獲取支付是否真的成功次坡。如果成功后臺(tái)可以做相應(yīng)的處理呼猪。
OrderQuery orderQuery = new OrderQuery();
orderQuery.setOrderId("sadfasdfas234234");
// PayBase.PAY_TYPE_1:支付寶;PayBase.PAY_TYPE_2:微信砸琅。默認(rèn):PayBase.PAY_TYPE_1
orderQuery.setPayType(PayBase.PAY_TYPE_2);
PayUtils.queryOrder(orderQuery);
2.3. 生成二維碼
主要用于生成二維碼供用戶掃碼支付宋距。這個(gè)接口的調(diào)用和 2.1 差不多,只是多了一個(gè) storeId 來記錄是那一臺(tái)設(shè)備生成的症脂。
2.4. 查詢訂單是否支付成功
這個(gè)接口的調(diào)用參數(shù)和 2.2 一樣谚赎。是 2.2 的一個(gè)特例淫僻,主要是為了方便查詢訂單是否支付成功
2.5 退款
支付寶
OrderRefund refundOrder = new OrderRefund();
refundOrder.setOrderId("sadfasdfas234234");
refundOrder.setRefundId("uniquesfsdfsdfsd");
refundOrder.setRefundAmount("1.23");
refundOrder.setTotalAmount("3.23");
refundOrder.setRefundReason("假貨");
// 可選參數(shù),默認(rèn)是人民幣
refundOrder.setRefundCurrency("USD");
PayUtils.refund(refundOrder);
另外你還可以通過 OrderRefund.alipayTradeRefundModel 屬性進(jìn)行自定義設(shè)置支付寶的參數(shù)壶唤。
微信
OrderRefund refundOrder = new OrderRefund();
refundOrder.setOrderId("sadfasdfas234234");
refundOrder.setRefundId("uniquesfsdfsdfsd");
refundOrder.setRefundAmount("1.23");
refundOrder.setTotalAmount("3.23");
refundOrder.setRefundReason("假貨");
refundOrder.setRefundCurrency("CNY");
refundOrder.setPayType(PayBase.PAY_TYPE_2);
// 以下為可選項(xiàng)
WeChatRefundInfo weChatRefundInfo = refundOrder.getWeChatRefundInfo();
weChatRefundInfo.setMchNo(1);// 配置的商戶號(hào)信息雳灵,默認(rèn):1
weChatRefundInfo.setMchAppIdNo(1);// 配置的 appid,默認(rèn):1
weChatRefundInfo.setNotifyUrl("http://www.baidu.com");// 異步通知 url闸盔,其實(shí)結(jié)果是實(shí)時(shí)返回的悯辙,不配置也是可以的
PayUtils.refund(refundOrder);
resultCode == SUCCESS 表示退款成功,如果返回 FAIL 或出現(xiàn)異常則退款失敗蕾殴,你需要定時(shí)的去處理這些退款失敗的訂單笑撞。
2.6. 轉(zhuǎn)賬到余額/零錢
支付寶
TransferMoneyInternal params = new TransferMoneyInternal();
params.setTransferId("sdfsdf");
params.setPayeeAccount("18658254585");
params.setAmount("100");
//以下為可選項(xiàng)
params.setReUserName("張三");
params.setDesc("轉(zhuǎn)賬測試");
TransferAccountsUtils.transferMoneyInternal(params);
還可以通過 TransferMoneyInternal.fundTransToaccountTransferModel 配置支付寶的轉(zhuǎn)賬信息。
微信
TransferMoneyInternal params = new TransferMoneyInternal();
params.setTransferId("sdfsdf");
params.setPayeeAccount("18658254585");
params.setAmount("100");
params.setPayType(PayBase.PAY_TYPE_2);
//以下為可選項(xiàng)
params.setReUserName("張三");
params.setDesc("轉(zhuǎn)賬測試");
TransferAccountsUtils.transferMoneyInternal(params);
2.7. 轉(zhuǎn)賬到銀行卡
只支持微信钓觉,支付寶沒開放此接口茴肥。
TransferToBankCardParams params = new TransferToBankCardParams();
params.setPartnerTradeNo("sdfsfsdf");
params.setEncTrueName("張三");
params.setEncBankNo("62223234235623423423");
params.setBankCode("1002");
params.setAmount("0.1");
// 以下為可選
params.setDesc("測試銀行卡轉(zhuǎn)賬");
params.setMchAppIdNo(1);
params.setMchNo(1);
TransferAccountsUtils.transferToBankCard(params);
2.8. 查詢轉(zhuǎn)賬到銀行卡
2.7 有可能返回 PROCESSING 對(duì)于這些訂單你需要定時(shí)去查詢這些訂單的狀態(tài),知道這些狀態(tài)為最終狀態(tài)荡灾。
2.9. 查詢轉(zhuǎn)賬到余額/零錢
It's all!