1. 程式人生 > >【SDK】01 支付寶當面付

【SDK】01 支付寶當面付

  1. 註冊支付寶開發者賬戶,訪問一下地址使用支付寶賬戶登入沙箱:

沒有入駐自研開發者的可以先入駐,實名認證。

成功完成入駐後,進入研發服務。 開發者中心 -> 開發服務 ->

在這裡插入圖片描述

  1. 下載安裝沙箱環境的 App

在這裡插入圖片描述

下載安裝完成後,到沙箱賬號頁面上,有商家和買家賬號,選擇買家進行登入。

  1. 登入完成後,配置支付寶沙箱應用的 RSA2 公鑰,到下面這個網址下載支付寶提供的 RSA 前面工具:

下載完成後解壓檔案,執行 RSA簽名工具.bat:

在這裡插入圖片描述

生成 Java 適用的 RSA2 金鑰:

在這裡插入圖片描述

複製生成的商戶應用公鑰:

在這裡插入圖片描述

然後將RSA2金鑰,配置到沙箱環境上:

在這裡插入圖片描述

將複製公鑰貼上到應用公鑰上:

在這裡插入圖片描述

配置完成之後,就可以檢視支付寶公鑰了

在這裡插入圖片描述

應用公鑰和私鑰存放在 RSA金鑰 目錄下:

在這裡插入圖片描述

  1. 匯入 jar 包

因為 alipay 的 jar 包,maven 倉庫中沒有,所以需要自己匯入。

在這裡插入圖片描述

還需要配置一下編譯外掛,以便於釋出到伺服器之後,也能使用 jar

<build>
	</plugins>
    <!-- maven的核心外掛之-complier外掛預設只支援編譯Java 1.4,因此需要加上支援高版本jre的配置,在pom.xml裡面加上 增加編譯外掛 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <encoding>UTF-8</encoding>
          <compilerArguments>
            <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
          </compilerArguments>
        </configuration>
      </plugin>
    </plugins>
  </build>

匯入 alipay 需要的依賴:

    <!-- alipay -->
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.10</version>
    </dependency>
    <dependency>
      <groupId>commons-configuration</groupId>
      <artifactId>commons-configuration</artifactId>
      <version>1.10</version>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.6</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>core</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
      <version>1.3</version>
    </dependency>
  1. 配置 zfbinfo.properties

# 支付寶閘道器名、partnerId和appId
open_api_domain =https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
pid = 商戶 UID 沙箱配置中有
appid = APPID 沙箱配置中有


# RSA私鑰、公鑰和支付寶公鑰
private_key = 前面生成的應用私鑰
public_key = 前面生成的應用公鑰

#SHA1withRsa對應支付寶公鑰
#alipay_public_key =  沙箱配置中的支付寶公鑰 (我們選擇的是 RSA2 ,所以這個不用配置)

#SHA256withRsa對應支付寶公鑰 
alipay_public_key = 沙箱配置中的支付寶公鑰

# 簽名型別: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2

# 當面付最大查詢次數和查詢間隔(毫秒)
max_query_retry = 5
query_duration = 5000

# 當面付最大撤銷次數和撤銷間隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000

# 交易保障執行緒第一次排程延遲和排程間隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900

  1. 接入測試
 // 測試當面付2.0支付
    public void test_trade_pay(AlipayTradeService service) {
        // (必填) 商戶網站訂單系統中唯一訂單號,64個字元以內,只能包含字母、數字、下劃線,
        // 需保證商戶系統端不能重複,建議通過資料庫sequence生成,
        String outTradeNo = "tradepay" + System.currentTimeMillis()
                            + (long) (Math.random() * 10000000L);

        // (必填) 訂單標題,粗略描述使用者的支付目的。如“xxx品牌xxx門店消費”
        String subject = "xxx品牌xxx門店當面付消費";

        // (必填) 訂單總金額,單位為元,不能超過1億元
        // 如果同時傳入了【打折金額】,【不可打折金額】,【訂單總金額】三者,則必須滿足如下條件:【訂單總金額】=【打折金額】+【不可打折金額】
        String totalAmount = "0.01";

        // (必填) 付款條碼,使用者支付寶錢包手機app點選“付款”產生的付款條碼
        String authCode = "使用者自己的支付寶付款碼"; // 條碼示例,286648048691290423
        // (可選,根據需要決定是否使用) 訂單可打折金額,可以配合商家平臺配置折扣活動,如果訂單部分商品參與打折,可以將部分商品總價填寫至此欄位,預設全部商品可打折
        // 如果該值未傳入,但傳入了【訂單總金額】,【不可打折金額】 則該值預設為【訂單總金額】- 【不可打折金額】
        //        String discountableAmount = "1.00"; //

        // (可選) 訂單不可打折金額,可以配合商家平臺配置折扣活動,如果酒水不參與打折,則將對應金額填寫至此欄位
        // 如果該值未傳入,但傳入了【訂單總金額】,【打折金額】,則該值預設為【訂單總金額】-【打折金額】
        String undiscountableAmount = "0.0";

        // 賣家支付寶賬號ID,用於支援一個簽約賬號下支援打款到不同的收款賬號,(打款到sellerId對應的支付寶賬號)
        // 如果該欄位為空,則預設為與支付寶簽約的商戶的PID,也就是appid對應的PID
        String sellerId = "";

        // 訂單描述,可以對交易或商品進行一個詳細地描述,比如填寫"購買商品3件共20.00元"
        String body = "購買商品3件共20.00元";

        // 商戶操作員編號,新增此引數可以為商戶操作員做銷售統計
        String operatorId = "test_operator_id";

        // (必填) 商戶門店編號,通過門店號和商家後臺可以配置精準到門店的折扣資訊,詳詢支付寶技術支援
        String storeId = "test_store_id";

        // 業務擴充套件引數,目前可新增由支付寶分配的系統商編號(通過setSysServiceProviderId方法),詳情請諮詢支付寶技術支援
        String providerId = "2088100200300400500";
        ExtendParams extendParams = new ExtendParams();
        extendParams.setSysServiceProviderId(providerId);

        // 支付超時,線下掃碼交易定義為5分鐘
        String timeoutExpress = "5m";

        // 商品明細列表,需填寫購買商品詳細資訊,
        List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
        // 建立一個商品資訊,引數含義分別為商品id(使用國標)、名稱、單價(單位為分)、數量,如果需要新增商品類別,詳見GoodsDetail
        GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx麵包", 1000, 1);
        // 建立好一個商品後新增至商品明細列表
        goodsDetailList.add(goods1);

        // 繼續建立並新增第一條商品資訊,使用者購買的產品為“黑人牙刷”,單價為5.00元,購買了兩件
        GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);
        goodsDetailList.add(goods2);

        String appAuthToken = "應用授權令牌";//根據真實值填寫

        // 建立條碼支付請求builder,設定請求引數
        AlipayTradePayRequestBuilder builder = new AlipayTradePayRequestBuilder()
            //            .setAppAuthToken(appAuthToken)
            .setOutTradeNo(outTradeNo).setSubject(subject).setAuthCode(authCode)
            .setTotalAmount(totalAmount).setStoreId(storeId)
            .setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId)
            .setExtendParams(extendParams).setSellerId(sellerId)
            .setGoodsDetailList(goodsDetailList).setTimeoutExpress(timeoutExpress);

        // 呼叫tradePay方法獲取當面付應答
        AlipayF2FPayResult result = service.tradePay(builder);
        switch (result.getTradeStatus()) {
            case SUCCESS:
                log.info("支付寶支付成功: )");
                break;

            case FAILED:
                log.error("支付寶支付失敗!!!");
                break;

            case UNKNOWN:
                log.error("系統異常,訂單狀態未知!!!");
                break;

            default:
                log.error("不支援的交易狀態,交易返回異常!!!");
                break;
        }
    }