# 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的支付环境时，必须点击"保存"，保存新的设置。

### **删除测试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 环境中进行测试。

所有In-App商品必须在Sandbox里进行1次以上测试，首次注册商品时，如有1个未进行测试的In-App商品，则无法激活验证请求按钮。

测试环境（商用和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上查询，在商用T测试中支付的记录可以在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/chi/tools/billing/v21/pre)页面中的"许可证密钥及OAuth认证信息确认"部分。\
    签名验证Key的值根据智能手机或服务器等认证的位置适当存储并使用。&#x20;
* 签名认证api sample
  * SDK提供"AppSecurity"Utility的Class，可使用"verifyPurchase"Method进行签名认证。\
    如果开发公司想不使用SDK，直接进行签名认证，则必须直接实现与"AppSecurity"相同功能的代码。\
    详细的实现内容参考与SDK library一起发放的sample。

<br>
