1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Spring Boot 接入支付寶,實(shí)戰(zhàn)來了!

        共 20143字,需瀏覽 41分鐘

         ·

        2021-04-17 13:35

        上一篇:深夜看了張一鳴的微博,讓我越想越后怕


        支付寶推出了新的轉(zhuǎn)賬接口alipay.fund.trans.uni.transfer(升級(jí)后安全性更高,功能更加強(qiáng)大) ,老轉(zhuǎn)賬接口alipay.fund.trans.toaccount.transfer將不再維護(hù),新老接口的一個(gè)區(qū)別就是新接口采用的證書驗(yàn)簽方式。

        使用新接口要將sdk版本升級(jí)到最新版本,博主升級(jí)時(shí)最新版本是4.10.97。

        接下來看集成步驟。

        1.將支付寶開放平臺(tái)里下載的3個(gè)證書放在resources下面

        2.寫支付寶支付的配置文件

        alipay.properties

        alipay.appId=你的應(yīng)用id
        alipay.serverUrl=https://openapi.alipay.com/gateway.do
        alipay.privateKey=你的應(yīng)用私鑰
        alipay.format=json
        alipay.charset=UTF-8
        alipay.signType=RSA2
        alipay.appCertPath=/cert/appCertPublicKey_2021001164652941.crt
        alipay.alipayCertPath=/cert/alipayCertPublicKey_RSA2.crt
        alipay.alipayRootCertPath=/cert/alipayRootCert.crt

        3.引入pom依賴

        <dependency>
             <groupId>com.alipay.sdk</groupId>
             <artifactId>alipay-sdk-java</artifactId>
             <version>4.10.97.ALL</version>
        </dependency>

        4.將配置信息注入AliPayBean

        import lombok.Data;
        import org.springframework.boot.context.properties.ConfigurationProperties;
        import org.springframework.context.annotation.PropertySource;
        import org.springframework.stereotype.Component;
         
        @Component
        @PropertySource("classpath:/production/alipay.properties")
        @ConfigurationProperties(prefix = "alipay")
        @Data
        public class AliPayBean {
            private String appId;
            private String privateKey;
            private String publicKey;
            private String serverUrl;
            private String domain;
            private String format;
            private String charset;
            private String signType;
            private String appCertPath;
            private String alipayCertPath;
            private String alipayRootCertPath;
         
        }

        5.寫配置類

        import com.alipay.api.AlipayClient;
        import com.alipay.api.CertAlipayRequest;
        import com.alipay.api.DefaultAlipayClient;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.util.FileCopyUtils;
         
        import java.io.InputStream;
         
         
        @Configuration
        public class AliConfig {
         
            @Value("${custom.http.proxyHost}")
            private String proxyHost;
            @Value("${custom.http.proxyPort}")
            private int proxyPort;
            @Value("${spring.profiles.active}")
            private String activeEnv;
         
            @Autowired
            private AliPayBean aliPayBean;
         
            @Bean(name = {"alipayClient"})
            public AlipayClient alipayClientService() throws Exception{
                CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
                //設(shè)置網(wǎng)關(guān)地址
                certAlipayRequest.setServerUrl(aliPayBean.getServerUrl());
                //設(shè)置應(yīng)用Id
                certAlipayRequest.setAppId(aliPayBean.getAppId());
                //設(shè)置應(yīng)用私鑰
                certAlipayRequest.setPrivateKey(aliPayBean.getPrivateKey());
                //設(shè)置請(qǐng)求格式,固定值json
                certAlipayRequest.setFormat(aliPayBean.getFormat());
                //設(shè)置字符集
                certAlipayRequest.setCharset(aliPayBean.getCharset());
                //設(shè)置簽名類型
                certAlipayRequest.setSignType(aliPayBean.getSignType());
                //如果是生產(chǎn)環(huán)境或者預(yù)演環(huán)境,則使用代理模式
                if ("prod".equals(activeEnv) || "stage".equals(activeEnv) || "test".equals(activeEnv)) {
                    //設(shè)置應(yīng)用公鑰證書路徑
                    certAlipayRequest.setCertContent(getCertContentByPath(aliPayBean.getAppCertPath()));
                    //設(shè)置支付寶公鑰證書路徑
                    certAlipayRequest.setAlipayPublicCertContent(getCertContentByPath(aliPayBean.getAlipayCertPath()));
                    //設(shè)置支付寶根證書路徑
                    certAlipayRequest.setRootCertContent(getCertContentByPath(aliPayBean.getAlipayRootCertPath()));
                    certAlipayRequest.setProxyHost(proxyHost);
                    certAlipayRequest.setProxyPort(proxyPort);
         
                }else {
                    //local
                    String serverPath = this.getClass().getResource("/").getPath();
                    //設(shè)置應(yīng)用公鑰證書路徑
                    certAlipayRequest.setCertPath(serverPath+aliPayBean.getAppCertPath());
                    //設(shè)置支付寶公鑰證書路徑
                    certAlipayRequest.setAlipayPublicCertPath(serverPath+aliPayBean.getAlipayCertPath());
                    //設(shè)置支付寶根證書路徑
                    certAlipayRequest.setRootCertPath(serverPath+aliPayBean.getAlipayRootCertPath());
                }
                return new DefaultAlipayClient(certAlipayRequest);
            }
            public String getCertContentByPath(String name){
                InputStream inputStream = null;
                String content = null;
                try{
                    inputStream = this.getClass().getClassLoader().getResourceAsStream(name);
                    content = new String(FileCopyUtils.copyToByteArray(inputStream));
                }catch (Exception e){
                    e.printStackTrace();
                }
                return content;
            }
         
        }

        6.寫支付工具類

        import com.alipay.api.AlipayApiException;
        import com.alipay.api.AlipayClient;
        import com.alipay.api.domain.AlipayTradeAppPayModel;
        import com.alipay.api.domain.AlipayTradeQueryModel;
        import com.alipay.api.request.AlipayTradeAppPayRequest;
        import com.alipay.api.request.AlipayTradeQueryRequest;
        import com.alipay.api.response.AlipayTradeAppPayResponse;
        import com.alipay.api.response.AlipayTradeQueryResponse;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.beans.factory.annotation.Qualifier;
        import org.springframework.stereotype.Service;
        /**
         * @description:支付寶工具類
         * @Date:2020-08-26
         */
        @Slf4j
        @Service
        public class AliPayUtils {
            @Autowired
            @Qualifier("alipayClient")
            private AlipayClient alipayClient;
         
            /**
             * 交易查詢接口
             * @param request
             * @return
             * @throws Exception
             */
            public boolean isTradeQuery(AlipayTradeQueryModel model) throws AlipayApiException {
                AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
                request.setBizModel(model);
                AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.certificateExecute(request);
                if(alipayTradeQueryResponse.isSuccess()){
                    return true;
                } else {
                    return false;
                }
            }
         
            /**
             * app支付
             * @param model
             * @param notifyUrl
             * @return
             * @throws AlipayApiException
             */
            public String startAppPay(AlipayTradeAppPayModel model, String notifyUrl)  throws AlipayApiException {
                AlipayTradeAppPayRequest aliPayRequest = new AlipayTradeAppPayRequest();
                model.setProductCode("QUICK_MSECURITY_PAY");
                aliPayRequest.setNotifyUrl(notifyUrl);
                aliPayRequest.setBizModel(model);
                // 這里和普通的接口調(diào)用不同,使用的是sdkExecute
                AlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliPayRequest);
                return aliResponse.getBody();
            }
            /**
             * 轉(zhuǎn)賬接口
             *
             * @param transferParams
             * @return AlipayFundTransToaccountTransferResponse
             */
             public AlipayFundTransUniTransferResponse doTransferNew(TransferParams transferParams) throws Exception {
         
                String title = (StringUtils.isNotBlank(transferParams.getRemark()) ? transferParams
                        .getRemark() : "轉(zhuǎn)賬");
                //轉(zhuǎn)賬請(qǐng)求入?yún)?br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
                //轉(zhuǎn)賬參數(shù)
                BizContentForUniTransfer bizContent = new BizContentForUniTransfer();
                bizContent.setOut_biz_no(transferParams.getOutBizNo());
                bizContent.setTrans_amount(MathUtil.changeF2Y(Math.abs(Integer.parseInt(transferParams.getAmount()))));
                bizContent.setProduct_code("TRANS_ACCOUNT_NO_PWD");
                bizContent.setBiz_scene("DIRECT_TRANSFER");
                bizContent.setOrder_title(title);
                Participant participant = new Participant();
                participant.setIdentity(transferParams.getPayeeAccount());
                participant.setIdentity_type(transferParams.getPayeeType());
                participant.setName((StringUtils.isNotBlank(transferParams.getPayeeRealName()) ? transferParams
                        .getPayeeRealName() : StringUtils.EMPTY));
                bizContent.setPayee_info(participant);
                bizContent.setRemark(title);
         
                request.setBizContent(JSON.toJSONString(bizContent));
         
                //轉(zhuǎn)賬請(qǐng)求返回
                AlipayFundTransUniTransferResponse response = null;
                try {
                    response = alipayClient.certificateExecute(request);
                } catch (Exception e) {
         
                    log.info("doTransfer exception,異常信息:{}", e.toString());
         
                    log.info("doTransfer exception,支付寶返回信息:{}", JSONObject.toJSONString(response));
         
                }
         
                log.info("doTransfer,AlipayFundTransUniTransferResponse:{}", JSONObject.toJSONString(response));
         
                return response;
            }
        }

        Spring Boot 最新教程推薦看這個(gè):

        https://github.com/javastacks/spring-boot-best-practice

        Tips:轉(zhuǎn)賬用到的類

        @Data
        public class TransferParams {
         
            /**
             * 應(yīng)用編號(hào)
             */
            private Long appId;
         
            /**
             * 創(chuàng)建人id
             */
            private Long createdBy;
         
            /**
             * 轉(zhuǎn)賬業(yè)務(wù)訂單號(hào)
             */
            private String outBizNo;
         
            /**
             * 收款方識(shí)別方式
             */
            private String payeeType;
         
            /**
             * 收款方賬號(hào),可以是支付寶userId或者支付寶loginId
             */
            private String payeeAccount;
         
            /**
             * 轉(zhuǎn)賬金額,單位分
             */
            private String amount;
         
            /**
             * 付款方名稱
             */
            private String payerShowName;
         
            /**
             * 收款方名稱
             */
            private String payeeRealName;
         
            /**
             * 備注
             */
            private String remark;
         
            /**
             * 支付寶轉(zhuǎn)賬流水號(hào)
             */
            private String orderId;
        }
        import lombok.Data;
         
        import java.math.BigDecimal;
         
        /**
         * 支付寶轉(zhuǎn)賬參數(shù)
         */
        @Data
        public class BizContentForUniTransfer {
            /**
             * 業(yè)務(wù)訂單號(hào)
             */
            private String out_biz_no;
         
            /**
             * 訂單總金額,單位為元,精確到小數(shù)點(diǎn)后兩位,
             */
            private BigDecimal trans_amount;
         
            /**
             * 業(yè)務(wù)產(chǎn)品碼,
             * 單筆無密轉(zhuǎn)賬到支付寶賬戶固定為:TRANS_ACCOUNT_NO_PWD;
             * 單筆無密轉(zhuǎn)賬到銀行卡固定為:TRANS_BANKCARD_NO_PWD;
             * 收發(fā)現(xiàn)金紅包固定為:STD_RED_PACKET;
             */
            private String product_code;
         
            /**
             * 描述特定的業(yè)務(wù)場(chǎng)景,可傳的參數(shù)如下:
             * DIRECT_TRANSFER:?jiǎn)喂P無密轉(zhuǎn)賬到支付寶/銀行卡, B2C現(xiàn)金紅包;
             * PERSONAL_COLLECTION:C2C現(xiàn)金紅包-領(lǐng)紅包
             */
            private String biz_scene;
         
            /**
             * 轉(zhuǎn)賬業(yè)務(wù)的標(biāo)題,用于在支付寶用戶的賬單里顯示
             */
            private String order_title;
         
            /**
             * 原支付寶業(yè)務(wù)單號(hào)。C2C現(xiàn)金紅包-紅包領(lǐng)取時(shí),傳紅包支付時(shí)返回的支付寶單號(hào);
             * B2C現(xiàn)金紅包、單筆無密轉(zhuǎn)賬到支付寶/銀行卡不需要該參數(shù)。
             */
            private String original_order_id;
         
            /**
             * 業(yè)務(wù)備注
             */
            private String remark;
         
            /**
             * 轉(zhuǎn)賬業(yè)務(wù)請(qǐng)求的擴(kuò)展參數(shù),支持傳入的擴(kuò)展參數(shù)如下:
             * 1、sub_biz_scene 子業(yè)務(wù)場(chǎng)景,紅包業(yè)務(wù)必傳,取值REDPACKET,C2C現(xiàn)金紅包、B2C現(xiàn)金紅包均需傳入;
             * 2、withdraw_timeliness為轉(zhuǎn)賬到銀行卡的預(yù)期到賬時(shí)間,可選(不傳入則默認(rèn)為T1),
             * 取值T0表示預(yù)期T+0到賬,取值T1表示預(yù)期T+1到賬,因到賬時(shí)效受銀行機(jī)構(gòu)處理影響,支付寶無法保證一定是T0或者T1到賬;
             */
            private String business_params;
         
            /**
             * 支付收款對(duì)象
             */
            private Participant payee_info;
        }
        @Data
        public class Participant {
            /**
             * 參與方的唯一標(biāo)識(shí)
             */
            private String identity;
         
            /**
             * 參與方的標(biāo)識(shí)類型,目前支持如下類型:
             * 1、ALIPAY_USER_ID 支付寶的會(huì)員ID
             * 2、ALIPAY_LOGON_ID:支付寶登錄號(hào),支持郵箱和手機(jī)號(hào)格式
             */
            private String identity_type;
         
            /**
             * 參與方真實(shí)姓名,如果非空,將校驗(yàn)收款支付寶賬號(hào)姓名一致性。
             * 當(dāng)identity_type=ALIPAY_LOGON_ID時(shí),本字段必填。
             */
            private String name;
        }

        原文鏈接:https://blog.csdn.net/qq_33556185/article/details/110445827
        感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。


            · END ·
        最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


        正文結(jié)束


        推薦閱讀 ↓↓↓

        1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

        2.如何才能成為優(yōu)秀的架構(gòu)師?

        3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

        4.程序員一般可以從什么平臺(tái)接私活?

        5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

        6.IntelliJ IDEA 2019.3 首個(gè)最新訪問版本發(fā)布,新特性搶先看

        7.漫畫:程序員相親圖鑒,笑屎我了~

        8.15張圖看懂瞎忙和高效的區(qū)別!

        一個(gè)人學(xué)習(xí)、工作很迷茫?


        點(diǎn)擊「閱讀原文」加入我們的小圈子!



        瀏覽 23
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久久久国产精品国产 | 日韩精品免费无码视频 | 国产性爱拍拍 | 青涩网| 欧美性爱操逼视频 | 操屄在线观看 | 男女性行为视频 | 大香蕉操逼逼网 | 欧美经典理伦电影人成电影网站 | 嗯灬啊灬快灬高潮了视频日本无码 |