溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java支付功能怎么實(shí)現(xiàn)

發(fā)布時間:2022-06-02 16:21:33 來源:億速云 閱讀:259 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“java支付功能怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java支付功能怎么實(shí)現(xiàn)”吧!

史上最簡單的支付SDK

首先我們先看下API:

package com.joe.pay;

import com.joe.pay.pojo.*;

/**
 * 支付服務(wù)接口
 *
 * @author joe
 * @version 2018.06.29 11:32
 */
public interface PayService {
    /**
     * 調(diào)用第三方支付
     *
     * @param request 支付參數(shù)
     * @return 支付結(jié)果
     */
    SysResponse<PayResponse> pay(PayRequest request);

    /**
     * 申請退款
     *
     * @param request 退款請求
     * @return 退款響應(yīng)
     */
    SysResponse<RefundResponse> refund(RefundRequest request);
}
   

可以看到,PayService接口提供了支付方法和退款方法,下面我們看下支付方法的參數(shù)定義:

package com.joe.pay.pojo;

import lombok.Data;

/**
 * 支付參數(shù),除了openid外所有參數(shù)必填
 *
 * @author joe
 * @version 2018.07.02 10:36
 */
@Data
public class PayRequest implements Request{
    /**
     * 商戶網(wǎng)站唯一訂單號
     */
    private String outTradeNo;
    /**
     * 對一筆交易的描述信息
     */
    private String body;
    /**
     * 商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等。
     * <p>
     * 對于微信支付來說需傳入應(yīng)用市場上的APP名字-實(shí)際商品名稱,天天愛消除-游戲充值。
     */
    private String subject;
    /**
     * 訂單生成時間,格式為yyyy-MM-dd HH:mm:ss
     */
    private String createTime;
    /**
     * 支付時長,單位為秒,如果設(shè)置300就是五分鐘,超過五分鐘訂單自動取消
     */
    private int expire = 300;
    /**
     * 訂單金額,單位為分
     */
    private int totalAmount;
    /**
     * 發(fā)起請求的用戶的實(shí)際IP
     */
    private String ip;
    /**
     * 支付類型:APP、WEB(微信對應(yīng)公眾號,支付寶對應(yīng)網(wǎng)頁支付)
     */
    private String tradeType = "APP";
    /**
     * 用戶openid,只有在微信公眾號支付時需要
     */
    private String openid;
    /**
     * 附加數(shù)據(jù),會與結(jié)果一并返回
     */
    private String attach;
}
   

OK,上邊的參數(shù)相信就算沒做過支付的同學(xué)也能很清晰直觀的看懂這些信息,都是一些訂單基本信息,下面我們來看退款參數(shù)的定義:

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;
    /**
     * 商戶系統(tǒng)訂單ID,與orderId不能同時為空
     */
    private String outTradeNo;
    /**
     * 商戶退款單號
     * <p>
     * 退款支持單筆交易分多次退款,多次退款需要提交原支付訂單的商戶訂單號和設(shè)置不同的退款單號。申請退款總金
     * <p>
     * 額不能超過訂單金額。 一筆退款失敗后重新提交,請不要更換退款單號,請使用原商戶退款單號。
     */
    @NotEmpty(message = "商戶退款單號不能為空")
    private String outRefundNo;
    /**
     * 訂單總金額,單位為分
     */
    @Size(min = 1)
    private int totalFee;
    /**
     * 退款金額,不能大于訂單總金額
     * <p>
     * 注:多次退款總金額不能大于訂單總金額
     */
    @Size(min = 1)
    private int refundFee;
    /**
     * 退款原因
     * <p>
     * 可以為空
     */
    private String refundDesc;
}
   

退款參數(shù)就更簡單了,需要的信息也是相當(dāng)少。有了這些之后我們就可以來看支付測試代碼了:

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;
    /**
     * 微信服務(wù)
     */
    private PayService wxPayService;
    private PayService aliPayService;

    @Before
    public void init() {
        //配置微信支付,需要將下列參數(shù)替換為自己的參數(shù)
        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";

        //配置支付寶支付,需要將下列參數(shù)替換為自己的參數(shù)
        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>
     * 注意:該測試當(dāng)前通不過,因?yàn)闆]有提供正確的證書,若想要測試通過則需要在配置文件中提供正確的微信證書和單號
     */
    @Test
    public void doWxRefund() {
        doRefund(wxPayService);
    }

    /**
     * 測試支付寶退款
     * <p>
     * 注意:該測試當(dāng)前通不過,若想要測試通過則需要提供正確的單號
     */
    @Test
    public void doAliRefund() {
        doRefund(aliPayService);
    }

    /**
     * 校驗(yàn)響應(yīng)
     *
     * @param response 響應(yīng)
     */
    private void check(SysResponse<? extends BizResponse> response) {
        Assert.assertTrue(response.isSuccess());
        Assert.assertTrue(response.getData().isSuccess());
    }

    /**
     * 發(fā)起支付請求
     *
     * @param service service
     */
    private void doPay(PayService service) {
        SysResponse<PayResponse> response = service.pay(buildPay());
        check(response);
    }

    /**
     * 發(fā)起退款請求
     *
     * @param service service
     */
    private void doRefund(PayService service) {
        SysResponse<RefundResponse> response = service.refund(buildRefund());
        System.out.println("結(jié)果是:" + response);
    }

    /**
     * 構(gòu)建一個支付訂單
     *
     * @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;
    }

    /**
     * 構(gòu)建一個退款訂單
     *
     * @return 退款訂單
     */
    private RefundRequest buildRefund() {
        RefundRequest request = new RefundRequest();
        request.setOutTradeNo("123456");
        request.setOutRefundNo("123456");
        request.setTotalFee(100 * 10);
        request.setRefundFee(100);
        return request;
    }
}

感謝各位的閱讀,以上就是“java支付功能怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java支付功能怎么實(shí)現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI