您好,登錄后才能下訂單哦!
這篇文章主要講解了“java支付功能怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java支付功能怎么實現”吧!
首先我們先看下API:
package com.joe.pay; import com.joe.pay.pojo.*; /** * 支付服務接口 * * @author joe * @version 2018.06.29 11:32 */ public interface PayService { /** * 調用第三方支付 * * @param request 支付參數 * @return 支付結果 */ SysResponse<PayResponse> pay(PayRequest request); /** * 申請退款 * * @param request 退款請求 * @return 退款響應 */ SysResponse<RefundResponse> refund(RefundRequest request); }
可以看到,PayService接口提供了支付方法和退款方法,下面我們看下支付方法的參數定義:
package com.joe.pay.pojo; import lombok.Data; /** * 支付參數,除了openid外所有參數必填 * * @author joe * @version 2018.07.02 10:36 */ @Data public class PayRequest implements Request{ /** * 商戶網站唯一訂單號 */ private String outTradeNo; /** * 對一筆交易的描述信息 */ private String body; /** * 商品的標題/交易標題/訂單標題/訂單關鍵字等。 * <p> * 對于微信支付來說需傳入應用市場上的APP名字-實際商品名稱,天天愛消除-游戲充值。 */ private String subject; /** * 訂單生成時間,格式為yyyy-MM-dd HH:mm:ss */ private String createTime; /** * 支付時長,單位為秒,如果設置300就是五分鐘,超過五分鐘訂單自動取消 */ private int expire = 300; /** * 訂單金額,單位為分 */ private int totalAmount; /** * 發起請求的用戶的實際IP */ private String ip; /** * 支付類型:APP、WEB(微信對應公眾號,支付寶對應網頁支付) */ private String tradeType = "APP"; /** * 用戶openid,只有在微信公眾號支付時需要 */ private String openid; /** * 附加數據,會與結果一并返回 */ private String attach; }
OK,上邊的參數相信就算沒做過支付的同學也能很清晰直觀的看懂這些信息,都是一些訂單基本信息,下面我們來看退款參數的定義:
package com.joe.pay.pojo; import lombok.Data; import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.Size; /** * 退款請求 * * @author joe * @version 2018.07.05 17:12 */ @Data public class RefundRequest { /** * 第三方賬單ID,與outTradeNo不能同時為空 */ private String orderId; /** * 商戶系統訂單ID,與orderId不能同時為空 */ private String outTradeNo; /** * 商戶退款單號 * <p> * 退款支持單筆交易分多次退款,多次退款需要提交原支付訂單的商戶訂單號和設置不同的退款單號。申請退款總金 * <p> * 額不能超過訂單金額。 一筆退款失敗后重新提交,請不要更換退款單號,請使用原商戶退款單號。 */ @NotEmpty(message = "商戶退款單號不能為空") private String outRefundNo; /** * 訂單總金額,單位為分 */ @Size(min = 1) private int totalFee; /** * 退款金額,不能大于訂單總金額 * <p> * 注:多次退款總金額不能大于訂單總金額 */ @Size(min = 1) private int refundFee; /** * 退款原因 * <p> * 可以為空 */ private String refundDesc; }
退款參數就更簡單了,需要的信息也是相當少。有了這些之后我們就可以來看支付測試代碼了:
package com.joe.pay; import com.joe.pay.pojo.*; import com.joe.pay.pojo.prop.PayProp; import com.joe.utils.common.DateUtil; import com.joe.utils.common.Tools; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * 支付測試 * * @author joe * @version 2018.07.02 14:38 */ public class PayServiceTest { /** * 微信配置 */ private PayProp wxProp; private PayProp aliProp; /** * 微信服務 */ private PayService wxPayService; private PayService aliPayService; @Before public void init() { //配置微信支付,需要將下列參數替換為自己的參數 wxProp = PayProp.builder() .appid("123123123") .notifyUrl("http://www.baidu.com") .useWxPay() .certInput(null) .key("123123123") .mchId("123123123123") .password("123123123123") .build(); wxPayService = PayServiceFactory.getInstance(wxProp); String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDEuQvaAad8+PAUVLeh9tqNsWNDCiAXEal4krM0E1" + "4oHiUvzOT8Xf5BYZeMmiA+G+Z4iT2dP6bNRBIth7W5COh51v8TDf4dYxqV3Jw7jyQF2K/p74izFXm96yDXz3cMotRdDW3JdcC" + "ME2tgrlSjJxN26qPCrHh+OL9Y/yqJGhsAHKlaIYQ4S8F9B3rIPMAv6MbTuHFrFXkwuJqesupTwUqzmPgriy/2Au9ZApnpVCex" + "sKIkjMwpmOe3FxaQ9U6271NA9jmzbg7ge5BlfblQL3lIkEQdoqPPKrfLbO3djN1ORn1vhKrIAUhIQAqWKDVdz9dGxrIZckGOe" + "8iuUGOs8D4VAgMBAAECggEBAIzyuJcekE5uXjVy7Y9SOw1Ch5hE/PEKao5FLbimF9ROpP42o+pdvgpCTj8jPu7BNsQuMMM2E+" + "EGYK/WiFFnHIlYIbIZWHTdyPKO+jGCQaEevAu04BDP1kZI7WMy9m1LTTTOplat06OJVmoS/flXyg5t159ny31EU3UEfgl1dts" + "AayODTTRkRUjYXYXSOSDLZjlxSntNS9seklPgEeinc2umrdzJuzciKspK1XLqpCvc+1WA2NlTkoW6Hc9aj61ySCOTkF/3OVjj" + "G58jiUMzSeRsG3gq3PEJfhw2FUiJxn04ZRId74tIKrjKV4Np97WdmFEkpTEUTqvSp3AUYm/wJ5ECgYEA9pzaM+dd7vacLbgkA" + "e3N8dfyJggSJWm5TpangYIfQBXp+TiLhHFP6lhpCrs/qoxdsmM6LtzEkchvAQOA1kgNgRhm4s1pihKc7aAqK9YxE2tT5Z8XXd" + "9SXdLoHXe7GW3Q2ivouMV+J31mhOwSlogR5q0AztXJCl0FH9HHehMyAC8CgYEAzDYJOTOiHm5xjAJ337dtVe1zGUUBwv58B2O" + "wZXp129frnOepM+B663aMbrh+IUzVSQWqufGKUkLwjbRmwjrs9Lw4nFYtNGYVp1wnFawVOXy532tthYG5m3i/KcXjIRwnNHew" + "9Xh5q9rDc30yPKMps+Uijrp7ktQIRfh+QbOi8PsCgYBQccXz3GsVwjgb6c9FGc9uLmT85vEUZzJdYmNtqYaMHxndhAZuw4+v/" + "/rz1zTjazo9MIUQOE+exmT/Tac/Pu24yL73CM5+jafHE9HtzsbfcMlDQ+wZYPm7RUsWIbJUjy/rmxsk+rc2Jn/EqEU/+U7tkk" + "2LKs2TpdhAEuwg9BYBXQKBgQCKAZKmJ7DOJBF0b06X0ByBz6DTWQFhyB4F2GcjjWkNE5TVSvHcbz5i1pD9Wo1S79vMJ5pDY2r" + "5QOfUvDAd3zi4BGO1s7+FA+BqZCq9yLfnS9VJmg5ABXVsDmQSVPu0KpSMLr9WhP34FjW0XM2QkSvjuVxrXLeaeNTGhLK+sCnT" + "9QKBgHfd3hhLWjO4zh99B+PRYFgpnJa9S5E1zzoejZVIJhK5q60KLV5n/HMxuHTGRZxpbfcH4/44d3Yz7ieccmCiPtqxFYUwP" + "W0JukNWDL2tOzTSZ5ABAwqorV3bM67mLUSt0O5dL4YtSBJ2J3F6joO1fTZEcUCybO/A5J4wTZDOV1AR"; //配置支付寶支付,需要將下列參數替換為自己的參數 aliProp = PayProp.builder() .appid("123123123") .notifyUrl("http://www.baidu.com") .useAliPay() .publicKey("123123") .privateKey(privateKey) .build(); aliPayService = PayServiceFactory.getInstance(aliProp); } /** * 測試微信支付 */ @Test public void doWxPay() { doPay(wxPayService); } /** * 測試支付寶支付 */ @Test public void doAliPay() { doPay(aliPayService); } /** * 測試微信退款 * <p> * 注意:該測試當前通不過,因為沒有提供正確的證書,若想要測試通過則需要在配置文件中提供正確的微信證書和單號 */ @Test public void doWxRefund() { doRefund(wxPayService); } /** * 測試支付寶退款 * <p> * 注意:該測試當前通不過,若想要測試通過則需要提供正確的單號 */ @Test public void doAliRefund() { doRefund(aliPayService); } /** * 校驗響應 * * @param response 響應 */ private void check(SysResponse<? extends BizResponse> response) { Assert.assertTrue(response.isSuccess()); Assert.assertTrue(response.getData().isSuccess()); } /** * 發起支付請求 * * @param service service */ private void doPay(PayService service) { SysResponse<PayResponse> response = service.pay(buildPay()); check(response); } /** * 發起退款請求 * * @param service service */ private void doRefund(PayService service) { SysResponse<RefundResponse> response = service.refund(buildRefund()); System.out.println("結果是:" + response); } /** * 構建一個支付訂單 * * @return 支付訂單 */ private PayRequest buildPay() { PayRequest payRequest = new PayRequest(); payRequest.setOutTradeNo(Tools.createUUID()); payRequest.setBody("天天愛消除-游戲充值"); payRequest.setSubject("天天愛消除-游戲充值"); payRequest.setCreateTime(DateUtil.getFormatDate(DateUtil.BASE)); payRequest.setTotalAmount(100 * 10); payRequest.setIp("106.120.141.226"); return payRequest; } /** * 構建一個退款訂單 * * @return 退款訂單 */ private RefundRequest buildRefund() { RefundRequest request = new RefundRequest(); request.setOutTradeNo("123456"); request.setOutRefundNo("123456"); request.setTotalFee(100 * 10); request.setRefundFee(100); return request; } }
感謝各位的閱讀,以上就是“java支付功能怎么實現”的內容了,經過本文的學習后,相信大家對java支付功能怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。