> ## Documentation Index
> Fetch the complete documentation index at: https://opendocs.xft.xin/llms.txt
> Use this file to discover all available pages before exploring further.

# 收银台 SDK

## 版本说明

|  版本号  |     更新时间    |     更新说明    |
| :---: | :---------: | :---------: |
| 1.0版本 | 2020年11月27日 |    支付SDK    |
| 1.1版本 | 2021年02月26日 | 新增交易记录查询SDK |

## 场景介绍

适用于在移动端APP中集成统一移动收银台功能。APP调用SDK调用支付模块，APP会跳转到收银台中完成支付，支付完后跳回商户APP内，最后展示支付结果。并可以查看支付记录列表及详情情况。

目前统一支付支持手机系统有：IOS（苹果）、Android（安卓）

![demo](https://file.91xft.cn:9002/cdn/demo01.png)

## 集成开发步骤（安卓）

### 1. 复制 xftsdk.aar 到 libs 目录

### 2. 修改 build.gradle 文件配置

```gradle theme={null}
defaultConfig {
    applicationId "com.changsha.apps.xxx.xxx"
    minSdkVersion 21
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar","*.aar"])
    api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.3'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
    implementation 'org.greenrobot:eventbus:3.1.1'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
    implementation 'me.jessyan:autosize:1.1.2'
    implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14'
    implementation 'com.contrarywind:Android-PickerView:4.1.8'
}
```

### 3. 初始化 SDK

创建自定义 application 继承 application 并配置生效。

```java theme={null}
XftPay.initPaySDK(this, appID, "https...");
```

目录下创建 `.wxapi` 包，包下创建 `WXPayEntryActivity` 类（包名和类名必须与示例一致）。

```java theme={null}
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_result);
        api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
        api.handleIntent(getIntent(), this);
    }
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }
    @Override public void onReq(BaseReq req) {}
    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle(R.string.app_tip);
            builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
            builder.show();
        }
    }
}
```

混淆时需在混淆文件中添加：`-keep class com.xft.android.pay.bean.** { *; }`

### 4. 使用注意

安装 GenSignature.apk 通过包名获取应用签名并联系对接人员修改微信开发平台配置参数进行测试。

### 5. 支付接口请求参数

| 字段              | 是否必选 | 字段类型   | 字段说明                 |
| --------------- | ---- | ------ | -------------------- |
| `app_id`        | 是    | String | app\_id              |
| `merchant_code` | 是    | String | 商户号                  |
| `user_id`       | 是    | String | 用户唯一标识               |
| `store_code`    | 否    | String | 门店编号                 |
| `operator_id`   | 否    | String | 操作员 id               |
| `limit_pay`     | 否    | String | 00-全部 01-限定不能使用信用卡支付 |
| `out_trade_no`  | 是    | String | 商户订单号                |
| `channel`       | 否    | String | 支付渠道                 |
| `product`       | 是    | String | 支付产品                 |
| `client_ip`     | 是    | String | 客户端调用的 IP            |
| `amount`        | 是    | String | 支付金额（分）              |
| `subject`       | 是    | String | 订单标题                 |
| `body`          | 是    | String | 商品描述                 |
| `description`   | 是    | String | 订单附加说明               |
| `notify_url`    | 否    | String | 交易通知地址               |
| `time_start`    | 否    | String | 订单生成时间               |
| `time_expire`   | 否    | String | 订单失效时间               |
| `sign_type`     | 是    | String | 签名类型                 |
| `Key`           | 是    | String | 签名密钥                 |

### 6. 请求示例

```java theme={null}
Rsp.Cashier cashier = new Rsp.Cashier();
cashier.setUser_id("55sjfrncjbe515415");
cashier.setApp_id("1260026915276718080");
cashier.setAmount("500");
cashier.setMerchant_code("1120100066003");
cashier.setSubject("测试项目");
cashier.setClient_ip("13.2.1.5");
cashier.setOut_trade_no("5854ffffss");
cashier.setBody("宁乡支付");
cashier.setProduct("WECHAT_APP");
cashier.setDescription("宁乡app微信支付");
cashier.setSign_type("MD5");
cashier.setKey("616D1AA11CCEADE0427294DA5E81FCBA");
```

### 7. 订单流水查询列表参数

| 字段               | 是否必选 | 字段类型   | 字段说明    |
| ---------------- | ---- | ------ | ------- |
| `app_id`         | 是    | String | app\_id |
| `agentId`        | 是    | String | 渠道商编号   |
| `userId`         | 是    | String | 用户唯一标识  |
| `titleStr`       | 否    | String | 标题文本    |
| `titleTextColor` | 否    | String | 标题文本颜色  |
| `titleBgColor`   | 否    | String | 标题背景颜色  |
| `titleInfoStr`   | 否    | String | 详情页标题   |
| `sign_type`      | 是    | String | 签名类型    |
| `key`            | 是    | String | 签名密钥    |

示例：

```java theme={null}
Rsp.OrderSelect orderSelect = new Rsp.OrderSelect();
orderSelect.setApp_id("969037206616276993");
orderSelect.setAgentId("212010016732");
orderSelect.setUserId("55sjfrncjbe515415");
orderSelect.setKey("6C7C97D68C7DB148DE678B4F5827D2F0");
orderSelect.setTitleBgColor("#2355df");
orderSelect.setTitleTextColor("#666666");
orderSelect.setTitleStr("测试(蓝色)");
XftPay.Jump(orderSelect);
```

## 集成开发步骤（iOS）

### 支付 SDK 示例

```objc theme={null}
ZXMainController *vc = [[ZXMainController alloc] init];
vc.baseUrl = @"https://test-xlink.91xft.cn";
vc.md5Key = @"616D1AA11CCEADE0427294DA5E81FCBA";
vc.passDict = @{@"amount":self.field.text,@"description":@"测试商品",@"sub_app_id":@"wxd359xxxx7xxxa",@"app_id":@"12600269152exxx80",@"merchant_code":@"11201000xxxx",@"out_trade_no":randomNum,@"product":@"WECHAT_APP",@"client_ip":@"218.76.8.29",@"subject":@"测试商品",@"body":@"测试商品",@"sign_type":@"MD5",@"user_id":@"vdjfnsdjhuhhdh55456e245"};
[self.navigationController pushViewController:vc animated:YES];
```

### 订单流水查询 SDK

```objc theme={null}
ZXOrderController *vc = [[ZXOrderController alloc] init];
vc.passColor = [UIColor redColor];
vc.baseUrl = @"https://test-xlink.91xft.cn";
vc.passDict = @{@"app_id":@"1260021591438262272",
                @"agent_code":@"211010011071",
                @"user_id":@"vdjfnsdjhuhhdh55456e245"};
vc.key = @"6D2A95DCE2D1BB70554DA20A2E9876A8";
[self.navigationController pushViewController:vc animated:YES];
```

### iOS 说明

1. 使用 CocoaPods 安装依赖库：`pod 'AFNetworking'`, `pod 'WechatOpenSDK'`, `pod 'MJRefresh'`
2. 在 AppDelegate 中初始化微信支付以及配置回调
3. 在 plist 中加 `LSApplicationQueriesSchemes` 字段
4. 调用 SDK 时只需将 framework 文件夹拖入项目中

订单流水查询：原支付 sdk 的基础上，在 other linker flags 中加上 `-ObjC`。

## SDK 包及示例

[详见附件《统一移动收银台SDK包及示例(安卓).zip》](https://file.91xft.cn:9001/xlink/pc-client/%E7%BB%9F%E4%B8%80%E6%94%AF%E4%BB%98%E6%94%B6%E9%93%B6%E5%8F%B0SDK%E6%96%87%E6%A1%A3%E5%8F%8A%E7%A4%BA%E4%BE%8BV1.1.zip)
