# In-App支付測試及安全性

## **概要** <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-gai-yao" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-gai-yao"></a>

One store在開發環境（以下稱"Sandbox"）和商用支付環境（以下稱"商用測試"）中支持In-App商品的支付測試。

Sandbox不是商用支付環境，而是虛擬支付環境。在支付界面中，如果您在支付失敗或成功時選擇了您所希望的回應，系统就會發送相應的回應结果。

商用測試是在商用支付環境中進行相應In-App商品的支付，並發送支付结果。

在商用測試環境下進行支付時，如不取消支付，則可能會產生費用，因此在支付測試後一定要取消支付。

{% hint style="info" %}

* 必須至少在您希望分發產品的操作系統上進行一次沙盒測試。
* 對於 OGL AAB/APK，可以在 Android 環境中進行沙盒測試。
* 為了在Sandbox及商用環境下進行測試，需事先將One store ID註冊為測試ID。\
  如果用未註冊的One store ID進行測試，則無法在Sandbox進行測試，且在商用測試環境下，進行的會是實際商用支付，而非測試商用支付，會導致產生實際費用，因此需要注意。
* One store對通過測試ID支付的訂單不負有責任。測試ID的管理及支付測試請在開發公司内部負責人的監管下進行。
  {% endhint %}

## **In-App支付測試界面** <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-inapp-zhi-fu-ce-shi-jie-mian" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-inapp-zhi-fu-ce-shi-jie-mian"></a>

在「應用內資訊」螢幕上，點擊「支付測試」按鈕即可進入應用內支付測試螢幕。\
在此螢幕上，您可以管理測試 ID 或查看支付測試記錄。

## **註冊及管理測試ID** <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-zhu-ce-ji-guan-li-ce-shi-id" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-zhu-ce-ji-guan-li-ce-shi-id"></a>

為了在開發及商用環境中測試In-App支付，必須事先註冊測試ID。

在In-App支付測試界面中選擇"註冊/管理測試ID"Tab，可轉至管理測試ID的界面。

測試ID為One store用戶ID，可查詢在One store註冊的會員ID進行註冊。&#x20;

如果不是One store會員，則可以運行One store應用軟件，創建一個測試用的One store ID後，然後將該ID註冊為測試ID即可。 &#x20;

### 註冊測試ID  <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-zhu-ce-ce-shi-id" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-zhu-ce-ce-shi-id"></a>

* 查詢要作為測試ID的One store會員ID。
* 確認查詢的One store ID後，用該測試ID選擇在哪个支付環境（Sandbox，商用測試）進行支付測試。
* 必要時輸入參考事項，單擊註冊按鈕註冊測試ID。

{% hint style="info" %}
一个測試ID只能選擇一个支付環境，而支付環境設置可隨時更改。
{% endhint %}

* 用已註冊的測試ID，可以設置進行支付測試的環境。&#x20;
* 更改測試ID的支付環境時，必須點擊"保存"，保存新的設置。<br>

### **刪除測試ID（個別刪除，批量刪除）** <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-shan-chu-ce-shi-id-ge-bie-shan-chu-pi-liang-shan-chu" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-shan-chu-ce-shi-id-ge-bie-shan-chu-pi-liang-shan-chu"></a>

* 測試ID不再有效時，可刪除測試ID。
* 可以點擊"刪除"按鈕後刪除個別測試ID，也可以選擇多個測試ID後點擊"刪除已選ID"按鈕進行批量刪除。

### **複製測試ID設置** <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-fu-zhi-ce-shi-id-she-zhi" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-fu-zhi-ce-shi-id-she-zhi"></a>

* 如果同一測試ID可以在多個應用軟件使用，則可以將測試ID設置複製到其他應用軟件。
* 只有可複製的應用軟件才能點擊check box，選擇好要複製的測試ID設置的對象軟件後，點擊"複製"。

## Sandbox環境下的支付測試（必選）  <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-sandbox-huan-jing-xia-de-zhi-fu-ce-shi-bi-xuan" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-sandbox-huan-jing-xia-de-zhi-fu-ce-shi-bi-xuan"></a>

#### Sandbox支付測試及驗證 <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-sandbox-zhi-fu-ce-shi-ji-yan-zheng" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-sandbox-zhi-fu-ce-shi-ji-yan-zheng"></a>

Sandbox不是商用支付環境，而是虛擬支付環境。在支付界面中，如果您在支付失敗或成功時選擇了您所希望的回應，系统就會發送相應的回應结果。

在Sandbox支付的訂單可以在In-App支付測試界面的"Sandbox"tap上查詢，也可以取消支付。

每個操作系統都需要至少在沙盒中進行一次測試。如果未進行測試，則無法提交驗證請求

> 不需要按國家/地區進行測試。您可以在任何方便的國家/地區進行測試。

如果通過 ONE Game Loop 分發 AAB/APK，請參考 Android 操作系統的測試結果，並在 Android 環境中進行測試。

測試環境（商用和Sandbox）資訊與ONE store服務連接期間保存在memory。 如果通過開發這中心變更了測試ID的測試環境，則必須中止應用軟件定重新啟動。

{% hint style="info" %}
只有當測試ID設置為Sandbox時，才能進行Sandbox支付測試。
{% endhint %}

### 訂閱型商品的sandbox測試 <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-ding-yue-xing-shang-pin-de-sandbox-ce-shi" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-ding-yue-xing-shang-pin-de-sandbox-ce-shi"></a>

開發訂閱型商品時,如果設定與實際時間相同的支付周期，測試就需要很長的時間。\
為此，Sandbox環境支持按訂閱周期調整所需時間，使測試更加順利。\
根據每個支付周期和功能，Sandbox内的時間流如下。

| **支付周期** | **Sandbox 內時間** |
| -------- | --------------- |
| 1周       | 5分              |
| 1個月      | 5分              |
| 3個月      | 10分             |
| 6個月      | 15分             |
| 1年       | 30分             |

| **功能**         | **Sandbox 内時間** |
| -------------- | --------------- |
| 免費訂閱           | 3分              |
| 延期時間           | 5分              |
| 保留帳號           | 10分             |
| 反映價格變更 (7天)    | 5分              |
| 價格變更同意期間 (30天) | 5分              |

## **商用測試環境下的支付測試（可選）**  <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-shang-yong-ce-shi-huan-jing-xia-de-zhi-fu-ce-shi-ke-xuan" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-shang-yong-ce-shi-huan-jing-xia-de-zhi-fu-ce-shi-ke-xuan"></a>

商用測試是在商用支付環境中進行相應In-App商品的支付，並發送支付结果。\
&#x20;\
商用測試支付的訂單可以在In-App支付測試界面"商用測試"tab查詢，也可以取消支付。\
在商用測試環境下進行支付時，如不取消支付，則可能會產生費用，因此在支付測試後一定要取消支付。

{% hint style="info" %}

* 測試ID設置為商用測試，才能在商用測試環境下進行支付測試。
* 如果使用未設置成商用測試的測試ID或未註冊為測試ID的One store ID進行支付時，將進行實際的商用支付而非測試的商用支付，請注意這會產生實際費用。\
  實際發生商用支付時，請立即向One store發送支付資訊，請求取消支付。
  {% endhint %}

## **In-App支付测试的支付结果确认及取消支付** <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-inapp-zhi-fu-ce-shi-de-zhi-fu-jie-guo-que-ren-ji-qu-xiao-zhi-fu" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-inapp-zhi-fu-ce-shi-de-zhi-fu-jie-guo-que-ren-ji-qu-xiao-zhi-fu"></a>

您可以对In-App支付測試歷史紀錄進行支付狀態確認及取消支付。 \
在Sandbox中支付的紀錄可以在In-App支付測試畫面的"Sandbox"Tab上查詢，在商用測試中支付的紀錄可以在In-App支付測試畫面的"商用測試"Tab上查詢。

### Sandbox環境 <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-sandbox-huan-jing" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-sandbox-huan-jing"></a>

* 提供在Sandbox環境下進行的支付測試的歷史紀錄
* 可以查詢已支付的商品資訊及支付狀態，也可以取消支付。

### 商用測試環境   <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-shang-yong-ce-shi-huan-jing" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-shang-yong-ce-shi-huan-jing"></a>

* 提供在商用測試環境下進行的支付測試的歷史紀錄。
* 可以查詢已支付的商品資訊及支付狀態，也可以取消支付。

## **安全性和認證** <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-an-quan-xing-he-ren-zheng" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-an-quan-xing-he-ren-zheng"></a>

### In-App支付的安全性 <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-inapp-zhi-fu-de-an-quan-xing" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-inapp-zhi-fu-de-an-quan-xing"></a>

* ONE store In-App支付使用簽名(Signature)的有效性認證方法驗證數據是否偽造和篡改，以確保安全支付。\
  由於手機應用軟件暴露在許多攻擊的威脅下，為了將這種危險降到最低，建議在開發公司應用軟件或服務器進行簽名認證。\
  下面是開發公司為了更安全的In-App支付需要進一步準備的事項。
* 使用開發公司服務器
  * 為了有效避開APK Reverse Engineering等的攻擊，體現代碼和Public key等可以在服務器中保管並進行認證。\
    在存儲購買資訊時，比起存儲在智能手機，建議最好存儲在開發公司服務器，來確認商品的使用許可。 &#x20;
* 使用已更改的代碼
  * One store提供的api sample是向很多人開放的代碼，比起直接使用原件，建議修改后後使用。 如果使用相同的代碼，那么就很容易暴露在攻擊的危險中。
  * 最好使用Proguard等代碼混淆工具保護支付相關代碼。
  * 即使是Public Key，在軟件代碼中加入普通字符串也不是安全的方法。建議例如與其他字符串進行XOR以避免輕易暴露等，使攻擊者無法輕易接近，這是安全的。 &#x20;
* 要求支付时使用"developerPayload"字段<br>
  * 開發公司在要求支付時，可將任意資訊放入"developerPayload"字段中，并在完成支付后重新收到信息。
  * 在相應字段中加入组合了timestamp等的附加安全驗證的數據，可以使支付结果的驗證更加安全。  &#x20;

## One store In-App支付認證方法 <a href="#inapp-zhi-fu-ce-shi-ji-an-quan-xing-onestoreinapp-zhi-fu-ren-zheng-fang-fa" id="inapp-zhi-fu-ce-shi-ji-an-quan-xing-onestoreinapp-zhi-fu-ren-zheng-fang-fa"></a>

* 認證準備
  * 為了認證的Key算法使用RSA方式，採用'SHA512withRSA'作為簽名的算法。\
    簽名驗證Key請參考[應用One store In-App支付的事前準備](https://onestore-dev.gitbook.io/dev/cht/tools/billing/v21/pre)頁面中的"許可證密鑰及OAuth認證資訊確認"部分。\
    簽名簽證KEY的值，根據智能手機或服務器等認證的位置適當存儲並用。&#x20;
* 簽名認證api sample
  * SDK提供"AppSecurity"Utility的Class，可使用"verifyPurchase"Method進行簽名認證。\
    如果開發公司想不使用SDK，直接進行簽名認證，則必須直接實現"AppSecurity"相同功能的代碼。\
    詳細的實現內容參考與SDK library一起發放的sample。
