BlockChyp iOS SDK
这是 iOS 的 SDK。它就像所有 BlockChyp SDK 一样,提供了一个完整的客户端用于 BlockChyp 网关和 BlockChyp 支付终端。SDK 使用 Objective-C 编写,但 Swift 开发者也可以使用它。
安装
安装 BlockChyp 的首选方法是使用 cocoapods。将以下依赖项添加到您的 Podfile 中,并输入 pod install
。
pod 'BlockChyp', '~> 2.15.24'
注意:如果您正在使用 Swift,请确保在 Podfile 中启用动态框架或在您的桥接头中创建。
一个简单的 Objective-C 示例
以下代码片段说明了如何从 Objective-C 运行一个简单的终端交易。
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request[@"test"] = @YES;
request[@"terminalName"] = @"Test Terminal";
request[@"amount"] = @"55.00";
[client chargeWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"Approved");
}
NSLog(@"%@: %@", @"authCode", [response objectForKey:@"authCode"])
NSLog(@"%@: %@", @"authorizedAmount", [response objectForKey:@"authorizedAmount"])
}];
[pool drain];
return 0;
}
一个简单的Swift示例
下面的代码片段展示了如何从Swift运行一个简单的终端事务。
import BlockChyp
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["amount"] = "55.00"
client.charge(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Approved")
}
NSLog("authCode" + ": " + (response["authCode"] as? String).unsafelyUnwrapped)
NSLog("authorizedAmount" + ": " + (response["authorizedAmount"] as? String).unsafelyUnwrapped)
})
所有对BlockChyp SDK的调用都必须是异步的,因此你必须为每个调用提供一个BlockChypCompletionHandler
块。完成处理器在BlockChypClient.h中声明为一个类型。
typedef void(^BlockChypCompletionHandler)(NSDictionary *request, NSDictionary *response, NSError * _Nullable error);
该块将传递原始请求的复制NSDictionary和作为NSDictionary的响应,以及任何可能相关的错误信息的NSError。
更多文档
完整文档可以在我们开发者文档门户找到。
获取开发者套件
为了测试您与真实终端的集成,您需要一个BlockChyp开发者套件。我们的套件包括一个全功能支付终端,带有测试PIN加密密钥。每个套件都包括一套全面的测试卡,包括每个主要卡品牌的测试卡和输入方式,包括非接触式和非接触EMV磁条卡。每个套件还包含测试礼品卡,适用于我们的区块链礼品卡系统。
BlockChyp的开发商程序目前仅限邀请,但您可以通过联系我们的工程技术团队在 [email protected] 请求邀请。
您还可以在我们的YouTube频道上查看多个长期形式演示并更多地了解我们。
交易代码示例
您不想阅读文字,您想要例子。以下是使用BlockChyp iOS SDK和一些基本示例的快速概述。
支付端点
这些是用于在BlockChyp中执行和操作支付交易的核心理由API。
扣费
- API凭证类型:商家
- 所需角色:支付API访问
我们最受欢迎的交易执行标准的授权和捕获。这是最基本的支付交易,通常用于传统零售。
扣费交易可以使用支付终端进行扣费,或使用已注册的支付令牌。
终端交易
对于终端交易,请确保使用 terminalName
属性传递终端名称。
令牌交易
如果您有支付令牌,请省略 terminalName
属性,并通过带有 token
属性的令牌传递。
卡号和磁条
您还可以传递PAN和磁条,但您可能不希望这样做,因为这会使您处于PCI范围之内,POS漏洞的最常见原因是键盘记录。如果您使用终端进行手动卡片输入,您将绕过可能在点-of Sale系统上恶意运行的任何键盘记录器。
常见变体
- 礼品卡赎回:在BlockChyp中,没有礼品卡赎回的特殊API。只需执行常规扣费交易,如果客户滑过礼品卡,我们的终端将识别礼品卡并运行礼品卡赎回。此外,请注意,如果由于某些原因,礼品卡的原购买交易与欺诈或退款相关,则交易将被拒绝。
- EBT:将
CardType
字段设置为[NSNumber numberWithInt:CARD_TYPE_EBT]
以处理EBT SNAP交易。注意,测试EBT交易的余额总是默认为100.00美元,因此超过该金额的测试EBT交易可能会被拒绝。 - 现金返还:要启用借记卡交易的现金返还,请设置
CashBack
字段。如果出示的卡片不是借记卡,则会忽略CashBack
字段。 - 手动卡输入:将
ManualEntry
字段设置为启用手动卡输入。当芯片和磁条读取器不工作或需要更安全的电话订单时,可作为备份使用。您甚至可以将ManualEntry
字段与将CardType
字段设置为[NSNumber numberWithInt:CARD_TYPE_EBT]
的选项结合起来,以进行手动EBT卡输入。 - 在线令牌化:您可以在创建交易时将支付方式注册到令牌安全存储器中,只需设置
Enroll
字段。您将在响应中获得一个令牌。如果还传递了客户数据,您甚至可以将此令牌绑定到客户记录中。 - 提示小费:如果您想在授权前提示客户输入小费,请设置
PromptForTip
字段。对于桌面支付和其他服务相关场景来说非常好。 - 现金折扣和额外收费:可以使用
Surcharge
和CashDiscount
字段共同支持现金折扣或额外收费问题。有关更多详细信息,请参阅现金折扣文档。 - 加密货币
Cryptocurrency
字段可用于将标准卡输入屏幕切换到加密货币屏幕。字段值可以是ANY
以启用任何受支持的加密货币,或者可以是一个单一的货币代码,例如BTC
用于比特币。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["amount"] = "55.00"
[client chargeWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
NSLog(@"%@: %@", @"authCode", [response objectForKey:@"authCode"])
NSLog(@"%@: %@", @"authorizedAmount", [response objectForKey:@"authorizedAmount"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["amount"] = "55.00"
client.charge(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
NSLog("authCode" + ": " + (response["authCode"] as? String).unsafelyUnwrapped)
NSLog("authorizedAmount" + ": " + (response["authorizedAmount"] as? String).unsafelyUnwrapped)
})
}
预授权
- API凭证类型:商家
- 所需角色:支付API访问
预授权会冻结资金并在稍后捕获。这用于最终交易金额可能发生变化的情况。一个常见的例子是高档餐饮,在最终结算前可能需要调整小费。
预先授权的另一个用途是电子商务。通常,在线订单在订单提交时进行预先授权,然后在订单发货时扣款。
预先授权可以使用支付终端进行扣款或使用之前注册的支付令牌。
终端交易
对于终端交易,请确保使用 terminalName
属性传递终端名称。
令牌交易
如果您有支付令牌,请省略 terminalName
属性,并通过带有 token
属性的令牌传递。
卡号和磁条
您还可以传入 PAN 和磁条,但这可能不是最佳选择,因为这会使您进入 PCI 范围,而 POS 破坏最常见的攻击方式是键盘记录。如果您使用终端进行手动卡输入,您将绕过可能恶意运行的 POS 系统中的任何键盘记录器。
加密货币
请注意,预先授权不支持加密货币。
常见变体
- 手动卡输入:将
ManualEntry
字段设置为启用手动卡输入。当芯片和 MSR 不能工作时或对于更安全的电话订单来说是一个好备选方案。您还可以将ManualEntry
字段与将CardType
设置为[NSNumber numberWithInt:CARD_TYPE_EBT]
的CardType
结合起来,以进行手动 EBT 卡输入。 - 内联令牌化:通过设置
Enroll
字段,您可以在扣款事务过程中将支付方式注册到令牌库中。您将在响应中收到一个令牌。如果也传递了客户数据,您甚至可以将令牌绑定到客户记录。 - 提示小费:如果您想在进行授权前提示客户付小费,请设置
PromptForTip
字段。您可以在预先授权过程中提示小费,尽管这不是一个常见的做法。 - 现金折扣和额外收费:可以使用
Surcharge
和CashDiscount
字段共同支持现金折扣或额外收费问题。有关更多详细信息,请参阅现金折扣文档。
从 Objective-C 来
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["amount"] = "27.00"
[client preauthWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
NSLog(@"%@: %@", @"authCode", [response objectForKey:@"authCode"])
NSLog(@"%@: %@", @"authorizedAmount", [response objectForKey:@"authorizedAmount"])
}];
[pool drain];
return 0;
}
从 Swift 来
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["amount"] = "27.00"
client.preauth(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
NSLog("authCode" + ": " + (response["authCode"] as? String).unsafelyUnwrapped)
NSLog("authorizedAmount" + ": " + (response["authorizedAmount"] as? String).unsafelyUnwrapped)
})
}
捕获预先授权
- API凭证类型:商家
- 所需角色:支付API访问
此 API 允许您捕获先前批准的预先授权。
您需要确保传入原始预先授权事务返回的交易 ID,这样我们就可以知道您要捕获哪笔交易。如果您想按预先授权的确切金额捕获交易,则交易 ID 就足够了。
如果您需要,可以通过传入一个新的 amount
来调整总额。我们还建议您传递更新后的 tax
和 tip
,因为它有时可以减少您的交易费率。(例如,二级处理。)
来自 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["transactionId"] = "<ORIGINAL TRANSACTION ID>"
request["amount"] = "32.00"
[client captureWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
}];
[pool drain];
return 0;
}
来自 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["transactionId"] = "<ORIGINAL TRANSACTION ID>"
request["amount"] = "32.00"
client.capture(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
})
}
退款
- API凭证类型:商家
- 所需角色:支付API访问
这不是理想的做法,但有时顾客想要退款。
我们的退款 API 允许您在几种不同的场景中执行退款,以应对这种不愉快的情况。
最具抗欺诈性的方法是在一个先前交易的情况下执行退款。您应该始终跟踪 BlockChyp 响应中返回的交易 ID。要全额退款先前的交易,只需在退款请求中传入原始交易 ID。
部分退款
对于部分退款,只需传入一个金额和交易 ID。唯一的规则是,金额必须等于或低于原始交易。只要退还的总额不超过原始金额,您就可以对同一原始交易执行多次部分退款。
标记退款
您还可以使用标记来执行退款。传递标记而不是交易 ID,并指定所需的退款金额。
自由退款
当您在不引用先前交易的情况下执行退款时,我们称之为 自由退款。
我们不推荐这种类型的退款,但它被允许。如果您坚持这样做,请传递终端名称和一个金额。
您可以通过将 ManualEntry
字段传递到自由退款请求中来执行手动的或键控的退款。
礼品卡退款
在先前交易的情况下允许礼品卡退款,但不允许自由退款礼品卡。如果需要向礼品卡添加更多资金,请使用礼品卡激活 API。
存储和转发支持
当终端降级到存储和转发模式时,不允许退款。
自动作废
如果在原交易批次关闭前,执行一个引用先前交易的退款并全额退款,退款将自动转为作废。这样可以节省商家一点钱。
加密货币
请注意,不支持对加密货币进行退款。您必须从您的加密货币钱包手动处理加密货币交易退款。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["transactionId"] = "<PREVIOUS TRANSACTION ID>"
request["amount"] = "5.00"
[client refundWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["transactionId"] = "<PREVIOUS TRANSACTION ID>"
request["amount"] = "5.00"
client.refund(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
})
}
作废
- API凭证类型:商家
- 所需角色:支付API访问
错误时有发生。如果您不小心完成了一笔交易,您可以使用此 API 进行作废。只需要传入一个交易 ID,并在原交易批次关闭前执行作废操作。
作废操作适用于 EBT 和礼品卡交易,无需额外参数。
加密货币
请注意,不支持对加密货币进行作废。您必须从您的加密货币钱包手动处理加密货币交易退款。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["transactionId"] = "<PREVIOUS TRANSACTION ID>"
[client voidWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
}];
[pool drain];
return 0;
}
从 Swift 来
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["transactionId"] = "<PREVIOUS TRANSACTION ID>"
client.void(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
})
}
超时反转
- API凭证类型:商家
- 所需角色:支付API访问
支付交易需要稳定的网络才能正确运行,而且没有任何网络总是稳定的。超时反转是在不稳定网络条件下重试支付时防止意外重复向消费者收费的一种很好的防御措施。
强烈建议开发者,一旦出现计费、预先授权或退款交易超时,就使用此 API。如果您没有收到 BlockChyp 的明确响应,您就不能确定交易是否已经完成。
在这种情况下,最佳做法是发送超时反转请求。超时反转会检查交易,并在存在的情况下将其作废。
唯一需要注意的是,开发者在执行计费、预先授权和退款交易时必须使用 transactionRef
属性(CLI 中的 txRef
)。
这一要求的原因是,如果系统从未收到该交易的明确响应,那么系统也从未收到 BlockChyp 生成的交易 ID。我们必须退回到交易引用来识别交易。
加密货币
请注意,不支持对加密货币进行退款。您必须从您的加密货币钱包手动处理加密货币交易退款。
从 Objective-C 来
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["transactionRef"] = "<LAST TRANSACTION REF>"
[client reverseWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
}];
[pool drain];
return 0;
}
从 Swift 来
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["transactionRef"] = "<LAST TRANSACTION REF>"
client.reverse(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
})
}
礼品卡激活
- API凭证类型:商家
- 所需角色:支付API访问
此API激活或向BlockChyp礼品卡中充值金额。只需传递终端名称和要添加到卡的金额。一旦顾客刷卡,终端将使用磁条上的密钥向卡片添加价值。
您无需对新的礼品卡激活或礼品卡充值有任何不同处理。终端固件将自行确定要执行的操作,同时返回礼品卡的新余额。
这是BlockChyp区块链DNA最接近表面的系统部分。BlockChyp礼品卡系统实际上并不使用礼品卡号码。这意味着它们不能被盗。
BlockChyp使用椭圆曲线公钥来识别卡片。礼品卡交易实际上是使用这些密钥签名的块。这意味着网络上不会发送任何共享机密。要跟踪BlockChyp礼品卡,请保留在礼品卡激活过程中返回的公钥。这就是礼品卡的椭圆曲线公钥。
我们有时在礼品卡上打印数字,但实际上这些是公钥一部分的十进制编码哈希值,以使礼品卡看起来对“普通人”正常。它们可以用于余额检查,并在在线礼品卡授权中扮演查找角色,但在此之外几乎没有什么用途。
作废和撤销
与任何其他BlockChyp交易一样,礼品卡激活可以被作废和撤销。使用交易ID或交易参考来识别礼品激活交易,就像您通常对常规支付交易执行作废或撤销操作一样。
导入礼品卡
BlockChyp确实具有从常规礼品卡平台导入礼品卡责任的能力。不幸的是,BlockChyp不支持在第三方系统上激活卡片。但是,您可以导入您的未销卡的礼品卡,并且顾客可以在终端上刷卡,就像BlockChyp的标准礼品卡一样。
访问此功能无需特殊编码。网关和终端固件为您处理一切。
第三方礼品卡网络
BlockChyp目前除了导入礼品卡责任外,不提供对其它礼品卡平台的任何本地支持。我们确实有一个白名单系统,可用于支持您自己的定制礼品卡实现。在我们可以允许将BIN范围列入白名单之前,我们有一个安全审查流程,因此如果您需要将BIN范围列入白名单,请联系[email protected]。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["amount"] = "50.00"
[client giftActivateWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
NSLog(@"%@: %@", @"amount", [response objectForKey:@"amount"])
NSLog(@"%@: %@", @"currentBalance", [response objectForKey:@"currentBalance"])
NSLog(@"%@: %@", @"publicKey", [response objectForKey:@"publicKey"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["amount"] = "50.00"
client.giftActivate(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
NSLog("amount" + ": " + (response["amount"] as? String).unsafelyUnwrapped)
NSLog("currentBalance" + ": " + (response["currentBalance"] as? String).unsafelyUnwrapped)
NSLog("publicKey" + ": " + (response["publicKey"] as? String).unsafelyUnwrapped)
})
}
余额
- API凭证类型:商家
- 所需角色:支付API访问
此API检查礼品卡或EBT卡的余额。
礼品卡余额检查
对于礼品卡,传入终端名称,然后顾客将被提示在该终端上刷卡。剩余余额将短暂显示在终端屏幕上,API响应将包括礼品卡的公钥和剩余余额。
EBT余额检查
所有EBT交易都需要PIN码,因此要检查EBT卡的余额,您需要传入与正常EBT收费交易相同的ebt
标志。顾客将被告知在该终端上刷卡并输入PIN码。如果一切检查无误,卡上的剩余余额将显示在终端上供顾客查看,并随API响应返回。
测试礼品卡余额检查
测试礼品卡余额检查与实际礼品卡的操作方式相同。您必须首先激活测试礼品卡才能测试余额检查。测试礼品卡是真实区块链卡,位于我们的平行测试区块链上。
测试EBT礼品卡余额检查
所有测试EBT交易都假定起始余额为100.00美元。因此,测试EBT余额检查始终返回余额为100.00美元。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["cardType"] = [NSNumber numberWithInt:CARD_TYPE_EBT]
[client balanceWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["cardType"] = [NSNumber numberWithInt:CARD_TYPE_EBT]
client.balance(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
关闭批次
- API凭证类型:商家
- 所需角色:支付API访问
此API将在批次当前未关闭时关闭商家的批次。
默认情况下,商家批次将在当地时区凌晨3点自动关闭。自动批次关闭时间可以在商家资料中更改或完全禁用。
如果禁用自动批量关闭,您将需要使用此API手动关闭批次。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
[client closeBatchWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
client.closeBatch(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
发送支付链接
- API凭证类型:商家
- 所需角色:支付API访问
此API允许您向客户发送发票并通过BlockChyp托管支付页面捕捉付款。
如果您设置了autoSend
标志,BlockChyp将为您自动向客户发送包含付款链接的基本发票电子邮件。如果您想更控制电子邮件的样式,可以省略autoSend
标志,自行向客户发送电子邮件。
此API有众多可选参数,但至少您需要传递总金额、客户姓名和电子邮件地址。(除非您使用cashier
标志。)
客户信息
除非您使用cashier
标志,您必须指定一个客户;要么通过在线创建一个新的客户记录,要么通过传递现有的客户ID或客户引用。
行项目级数据
这并非严格必要,但我们强烈建议每次请求都发送行项级详细信息。这将使发票看起来更完整,行项级数据的数据格式与终端行项显示的数据格式完全相同,因此可以使用相同的代码支持这两个区域。
描述
您还可以提供一种自由格式的描述或消息,以在发票底部的附近显示。这通常是某种感谢语或说明。
条款和条件
您可以在请求时包括长形式的合同语言,并同时捕捉接受支付时的条款和条件。
该界面与用于基于终端的条款和条件API的界面相同,您可以通过tcContent
直接传递内容,或通过tcAlias
通过预先配置的模板传递。在将协议接受整合到发送链接请求时,条款和条件日志也将被更新。
自动发送
BlockChyp不会自动发送电子邮件通知。这种保障措施防止在您可能不会期望邮件发送出去的情况下发出真实电子邮件。如果您想让BlockChyp为您发送电子邮件,只需在所有请求中添加autoSend
标志即可。
加密货币
如果商家配置支持加密货币交易,支付页面将显示额外的UI小部件,允许客户切换到加密货币支付方式。
令牌化
请在发送链接请求中添加enroll
标志以将支付方式注册到令牌库中。
收银员端卡输入
BlockChyp还可以用来生成内部/收银员端卡输入页面。这是为那些可能需要处理电话订单但没有终端可用的情况而设计的。
如果您传递了cashier
标志,则不会发送电子邮件,并且您可以加载链接到浏览器或iframe中进行支付输入。当使用cashier
标志时,将忽略autoSend
标志。
请注意,加密货币不支持收银员端支付输入。
支付通知
当客户成功提交付款时,商家将收到一封电子邮件通知他们已收到付款。
实时回调通知
电子邮件通知是不错的,但您可能希望您的系统在每次支付事件发生时立即通知。通过使用可选的callbackUrl
请求属性,您可以指定一个URL,每当用户提交付款时(无论批准与否),授权响应都将被发布到该URL。
将发送JSON编码的POST请求,其格式与所有BlockChyp扣款和预授权交易响应完全相同。
状态轮询
如果实时回调在您的情况下不实用或不是必需的,您始终可以使用下面描述的交易状态API。
使用带状态轮询的发送链接API的常见用例是路边取货。您可以在客户到达时检查交易状态,以确保已经付款,而无需创建后台线程不断轮询状态更新。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["transactionRef"] = "<TX REF>"
request["amount"] = "199.99"
request["description"] = "Widget"
request["subject"] = "Widget invoice"
var transaction: [String:Any] = [:]
transaction["subtotal"] = "195.00"
transaction["tax"] = "4.99"
transaction["total"] = "199.99"
var items = [Any]();
var items1: [String:Any] = [:]
items1["description"] = "Widget"
items1["price"] = "195.00"
items1["quantity"] = 1
items.append(items1)
transaction["items"] = items
request["transaction"] = transaction
request["autoSend"] = true
var customer: [String:Any] = [:]
customer["customerRef"] = "Customer reference string"
customer["firstName"] = "FirstName"
customer["lastName"] = "LastName"
customer["companyName"] = "Company Name"
customer["emailAddress"] = "[email protected]"
customer["smsNumber"] = "(123) 123-1231"
request["customer"] = customer
[client sendPaymentLinkWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"url", [response objectForKey:@"url"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["transactionRef"] = "<TX REF>"
request["amount"] = "199.99"
request["description"] = "Widget"
request["subject"] = "Widget invoice"
var transaction: [String:Any] = [:]
transaction["subtotal"] = "195.00"
transaction["tax"] = "4.99"
transaction["total"] = "199.99"
var items = [Any]();
var items1: [String:Any] = [:]
items1["description"] = "Widget"
items1["price"] = "195.00"
items1["quantity"] = 1
items.append(items1)
transaction["items"] = items
request["transaction"] = transaction
request["autoSend"] = true
var customer: [String:Any] = [:]
customer["customerRef"] = "Customer reference string"
customer["firstName"] = "FirstName"
customer["lastName"] = "LastName"
customer["companyName"] = "Company Name"
customer["emailAddress"] = "[email protected]"
customer["smsNumber"] = "(123) 123-1231"
request["customer"] = customer
client.sendPaymentLink(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("url" + ": " + (response["url"] as? String).unsafelyUnwrapped)
})
}
取消支付链接
- API凭证类型:商家
- 所需角色:支付API访问
此API用于取消支付链接。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["linkCode"] = "<PAYMENT LINK CODE>"
[client cancelPaymentLinkWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["linkCode"] = "<PAYMENT LINK CODE>"
client.cancelPaymentLink(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
交易状态
- API凭证类型:商家
- 所需角色:支付API访问
此API返回任何交易的当前状态。您可以通过其BlockChyp分配的交易ID或您的交易所查询交易。
您应该始终使用全局唯一的交易所值,但是在事件中您重复交易所值,则将返回与您的交易所值匹配的最新交易。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["transactionId"] = "<TRANSACTION ID>"
[client transactionStatusWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"responseDescription", [response objectForKey:@"responseDescription"])
NSLog(@"%@: %@", @"authorizedAmount", [response objectForKey:@"authorizedAmount"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["transactionId"] = "<TRANSACTION ID>"
client.transactionStatus(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("responseDescription" + ": " + (response["responseDescription"] as? String).unsafelyUnwrapped)
NSLog("authorizedAmount" + ": " + (response["authorizedAmount"] as? String).unsafelyUnwrapped)
})
}
现金折扣
- API凭证类型:商家
- 所需角色:支付API访问
此API计算现金交易的附加费、现金折扣和总金额。
如果您正在使用BlockChyp的现金折扣功能,您可以使用此端点确保真现金交易的金额和收据与BlockChyp处理的交易一致。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["amount"] = "100.00"
request["cashDiscount"] = true
request["surcharge"] = true
[client cashDiscountWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"amount", [response objectForKey:@"amount"])
}];
[pool drain];
return 0;
}
From Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["amount"] = "100.00"
request["cashDiscount"] = true
request["surcharge"] = true
client.cashDiscount(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("amount" + ": " + (response["amount"] as? String).unsafelyUnwrapped)
})
}
批量历史记录
- API凭证类型:商家
- 所需角色:支付API访问
此端点允许开发者查询网关的商户批量历史记录。数据将按开放日期的降序返回,最新的批量记录首先返回。结果将包括有关批量的基本信息。请考虑使用批量详细信息API以获取关于特定批量的更多详细信息。
限制结果
此API将返回最多250个结果。使用maxResults
属性进一步限制最大结果数量,并使用startIndex
属性分页浏览跨越多个查询的结果。
例如,如果您想要最近的十个批量记录,请将maxResults
的值设为10
。请注意,startIndex
是从零开始的。将值设置为0
以获取数据集中的第一个批量记录。
按日期范围筛选
您还可以按日期筛选结果。使用startDate
和endDate
属性仅返回在那些日期之间开放的批量记录。您可以单独使用startDate
和endDate
,您还可以将日期过滤器与maxResults
和startIndex
一起使用。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["maxResults"] = 250
request["startIndex"] = 0
[client batchHistoryWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
From Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["maxResults"] = 250
request["startIndex"] = 0
client.batchHistory(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
批量详情
- API凭证类型:商家
- 所需角色:支付API访问
此API允许开发者拉取特定批次的详情,包括捕获量、礼品卡活动、预期存款和按终端分拆的捕获量。
仅需要的请求参数是batchId
。批处理ID与每个事务响应一起返回,可以使用批处理历史API找到。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["batchId"] = "<BATCH ID>"
[client batchDetailsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"capturedAmount", [response objectForKey:@"capturedAmount"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["batchId"] = "<BATCH ID>"
client.batchDetails(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("capturedAmount" + ": " + (response["capturedAmount"] as? String).unsafelyUnwrapped)
})
}
交易历史
- API凭证类型:商家
- 所需角色:支付API访问
此端点提供了多种筛选事务历史记录的方法。
默认情况下,如果不进行筛选,此端点将返回最近的250笔交易。
限制结果
此API将单个查询中返回最多50个结果。使用maxResults
属性进一步限制最大结果数,并使用startIndex
属性遍历跨越多个查询的结果。
例如,如果您想获取最近的10个批次,则在maxResults
中传入一个值为10
。请注意,startIndex
是从零开始的。传入一个值为0
以获取数据集中的第一笔交易。
按日期范围筛选
您还可以按日期筛选结果。使用 startDate
和 endDate
属性仅返回在这两个日期之间进行的交易。您可以使用 startDate
或 endDate
,并且可以将日期筛选器与 maxResults
和 startIndex
结合使用。
按批次筛选
要限制结果为单个批次,请传递 batchId
参数。
按终端筛选
要限制结果为在单个终端上执行的交易,请传递终端名称。
组合筛选
上述任何筛选器都不是相互排斥的。您可以在单个请求中将上述任何属性组合起来,以限制交易结果为更窄的结果集。
搜索交易历史
您可以通过传递具有 query
选项的搜索标准来搜索交易历史。搜索系统将匹配金额(请求和授权)、卡号最后四位、持卡人姓名和授权码。
请注意,当使用搜索查询时,不支持终端名称或批次 ID 筛选器。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["maxResults"] = 10
request["batchId"] = "<BATCH ID>"
[client transactionHistoryWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["maxResults"] = 10
request["batchId"] = "<BATCH ID>"
client.transactionHistory(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
排队交易列表
- API凭证类型:商家
- 所需角色:支付API访问
返回终端上排队交易的交易引用列表。可以使用交易状态 API 获取交易的详细信息。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
[client listQueuedTransactionsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
client.listQueuedTransactions(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除队列事务
- API凭证类型:商家
- 所需角色:支付API访问
从终端删除一个或所有队列事务。如果传递*
作为事务引用,则整个终端队列将被清除。如果传递的事务引用未在终端队列上,则返回错误。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
request["transactionRef"] = "*"
[client deleteQueuedTransactionWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
request["transactionRef"] = "*"
client.deleteQueuedTransaction(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
端点管理
这些API支持终端管理功能以及如行项显示、消息和交互式提示等额外终端功能。
这些功能可以用来扩展销售点的功能。
终端Ping
- API凭证类型:商家
- 所需角色:支付API访问
这个简单的测试事务有助于确保与支付终端良好的通信,通常是你在开发中要运行的第一个测试。
它测试与终端的通信,如果一切正常,则返回正面响应。它以相同的方式在本地或云中继模式下工作。
如果您得到正面响应,则已成功验证以下所有内容
- 终端在线。
- 有一个有效的路由到达终端。
- API凭证有效。
从Objective-C启动
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
[client pingWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift启动
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
client.ping(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
终端定位
- API凭证类型:商家
- 所需角色:支付API访问
此端点返回终端的路由和位置信息。
结果将指示终端是否处于云中继模式,如果终端处于本地模式,將返回本地IP地址。
终端还将返回终端的公钥。
从Objective-C来
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
[client locateWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift来
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
client.locate(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
终端清除
- API凭证类型:商家
- 所需角色:支付API访问
此API会中断终端可能正在执行的操作,并将其返回到空闲状态。
从Objective-C来
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
[client clearWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
client.clear(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
终端状态
- API凭证类型:商家
- 所需角色:支付API访问
该 API 返回支付终端的当前状态。通常用作在发送新交易之前确定终端是否忙碌的方法。
如果终端忙碌,则 idle
将为 false,且 status
字段将返回指示当前正在进行的交易类型的简短字符串。系统还将返回 since
字段中的最近状态更改的时间戳。
响应中的 cardInSlot
字段将指示卡片是否目前在读卡器插槽中。
如果系统正在执行支付交易并且您明智地传递了Transaction Ref,则此 API 还将返回正在进行的交易的Transaction Ref。
下表列出了所有可能的状态响应。
状态代码 | 描述 |
---|---|
idle | 终端空闲,并准备好进行交易。正在显示默认品牌。 |
activate | 终端正在激活并配对商户账户。 |
balance | 终端上正在挂起余额检查(电子转账卡或礼品卡)。 |
boolean-prompt | 终端上正在挂起布尔提示(是/否)操作。 |
signature | 正在挂起签名捕获。 |
crypto | 正在挂起加密货币交易。 |
enroll | 正在挂起令牌保险库注册操作。 |
gift-activate | 正在进行礼品卡激活操作。 |
message | 终端正在显示自定义消息。 |
charge | 终端正在执行收费交易。 |
preauth | 终端正在执行预授权交易。 |
refund | 终端正在执行退款交易。 |
survey | 终端正在显示交易后的调查问题。 |
terms-and-conditions | 终端正在挂起接受条款和条件及签名。 |
text-prompt | 终端正在等待响应文本输入提示。 |
txdisplay | 终端正在显示交易和/或行项级详细信息。 |
从 Objective-C 转换
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
[client terminalStatusWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"idle", [response objectForKey:@"idle"])
NSLog(@"%@: %@", @"status", [response objectForKey:@"status"])
}];
[pool drain];
return 0;
}
从 Swift 转换
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
client.terminalStatus(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("idle" + ": " + (response["idle"] as? String).unsafelyUnwrapped)
NSLog("status" + ": " + (response["status"] as? String).unsafelyUnwrapped)
})
}
捕获签名
- API凭证类型:商家
- 所需角色:支付API访问
此端点会从设备终端捕获手写签名并返回图像。
与条款和条件 API 不同,此端点执行基本的签名捕获,不显示协议或存档签名。
在底层,签名以专有矢量格式捕获,必须转换为常见光栅格式才能为大多数应用程序使用。至少,您必须使用 sigFormat
参数指定图像格式。目前,支持 JPG 和 PNG。
默认情况下,图像以十六进制编码的二进制形式返回 JSON 响应。您可以使用 sigFile
参数将二进制图像输出重定向到文件。
您还可以通过传递 sigWidth
参数来缩放输出图像到您喜欢的宽度。图像将按该宽度缩放,同时保留原始图像的纵横比。
从 Objective-C 转换
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
request["sigFormat"] = SIGNATURE_FORMAT_PNG
request["sigWidth"] = 200
[client captureSignatureWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
request["sigFormat"] = SIGNATURE_FORMAT_PNG
request["sigWidth"] = 200
client.captureSignature(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
新交易显示
- API凭证类型:商家
- 所需角色:支付API访问
该 API 向终端发送总金额和行项目级别的数据。
至少,你应该在显示请求中发送总信息,包括 total
(总金额)、tax
(税)和 subtotal
(小计)。
你还可以发送行项目级别的数据,每个行项目可以有一个 description
(描述)、qty
(数量)、price
(单价)和 extended
(扩展)价格。
如果你未能发送扩展价格,BlockChyp 会将 qty
(数量)乘以 price
(单价)。然而,我们强烈建议你自己预先计算所有字段以确保一致性。例如,你处理浮点数乘法和舍入的方式可能与 BlockChyp 的略有不同。
折扣
你有选择将折扣以单个行项目形式显示,其值为负数,或者将折扣关联到特定的行项目。你可以为单个行项目应用任意数量的折扣,并包含描述和金额。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
var transaction: [String:Any] = [:]
transaction["subtotal"] = "60.00"
transaction["tax"] = "5.00"
transaction["total"] = "65.00"
var items = [Any]();
var items1: [String:Any] = [:]
items1["description"] = "Leki Trekking Poles"
items1["price"] = "35.00"
items1["quantity"] = 2
items1["extended"] = "70.00"
var discounts = [Any]();
var discounts1: [String:Any] = [:]
discounts1["description"] = "memberDiscount"
discounts1["amount"] = "10.00"
discounts.append(discounts1)
items1["discounts"] = discounts
items.append(items1)
transaction["items"] = items
request["transaction"] = transaction
[client newTransactionDisplayWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
var transaction: [String:Any] = [:]
transaction["subtotal"] = "60.00"
transaction["tax"] = "5.00"
transaction["total"] = "65.00"
var items = [Any]();
var items1: [String:Any] = [:]
items1["description"] = "Leki Trekking Poles"
items1["price"] = "35.00"
items1["quantity"] = 2
items1["extended"] = "70.00"
var discounts = [Any]();
var discounts1: [String:Any] = [:]
discounts1["description"] = "memberDiscount"
discounts1["amount"] = "10.00"
discounts.append(discounts1)
items1["discounts"] = discounts
items.append(items1)
transaction["items"] = items
request["transaction"] = transaction
client.newTransactionDisplay(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
更新交易显示
- API凭证类型:商家
- 所需角色:支付API访问
与新建交易显示类似,此版本允许开发者更新目前正在终端上显示的行项目级数据。
此功能是为那些希望在扫描项目时更新终端显示的情况设计的。您只需发送已更改的信息到终端,这通常意味着新的行项目和更新的总计。
如果终端不在行项目显示模式下,并且调用此端点,第一次调用将表现得像一个新建交易显示调用。
至少,你应该在显示请求中发送总信息,包括 total
(总金额)、tax
(税)和 subtotal
(小计)。
你还可以发送行项目级别的数据,每个行项目可以有一个 description
(描述)、qty
(数量)、price
(单价)和 extended
(扩展)价格。
如果你未能发送扩展价格,BlockChyp 会将 qty
(数量)乘以 price
(单价)。然而,我们强烈建议你自己预先计算所有字段以确保一致性。例如,你处理浮点数乘法和舍入的方式可能与 BlockChyp 的略有不同。
折扣
你有选择将折扣以单个行项目形式显示,其值为负数,或者将折扣关联到特定的行项目。你可以为单个行项目应用任意数量的折扣,并包含描述和金额。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
var transaction: [String:Any] = [:]
transaction["subtotal"] = "60.00"
transaction["tax"] = "5.00"
transaction["total"] = "65.00"
var items = [Any]();
var items1: [String:Any] = [:]
items1["description"] = "Leki Trekking Poles"
items1["price"] = "35.00"
items1["quantity"] = 2
items1["extended"] = "70.00"
var discounts = [Any]();
var discounts1: [String:Any] = [:]
discounts1["description"] = "memberDiscount"
discounts1["amount"] = "10.00"
discounts.append(discounts1)
items1["discounts"] = discounts
items.append(items1)
transaction["items"] = items
request["transaction"] = transaction
[client updateTransactionDisplayWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
var transaction: [String:Any] = [:]
transaction["subtotal"] = "60.00"
transaction["tax"] = "5.00"
transaction["total"] = "65.00"
var items = [Any]();
var items1: [String:Any] = [:]
items1["description"] = "Leki Trekking Poles"
items1["price"] = "35.00"
items1["quantity"] = 2
items1["extended"] = "70.00"
var discounts = [Any]();
var discounts1: [String:Any] = [:]
discounts1["description"] = "memberDiscount"
discounts1["amount"] = "10.00"
discounts.append(discounts1)
items1["discounts"] = discounts
items.append(items1)
transaction["items"] = items
request["transaction"] = transaction
client.updateTransactionDisplay(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
显示消息
- API凭证类型:商家
- 所需角色:支付API访问
此 API 在交易终端上显示消息。
只需指定目标终端和消息使用 message
参数。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["message"] = "Thank you for your business."
[client messageWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["message"] = "Thank you for your business."
client.message(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
布尔提示
- API凭证类型:商家
- 所需角色:支付API访问
该 API 提示客户回答是或否的问题。
您可以通过指定 prompt
参数来提问或提示,并在 response
字段中返回答案。
这可以用于许多用例,包括启动忠诚度注册工作流程或面向客户的建议式销售提示。
自定义标题
您可以选择使用 yesCaption
和 noCaption
请求参数来覆盖“是”和“否”按钮的标题。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["prompt"] = "Would you like to become a member?"
request["yesCaption"] = "Yes"
request["noCaption"] = "No"
[client booleanPromptWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"response", [response objectForKey:@"response"])
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["prompt"] = "Would you like to become a member?"
request["yesCaption"] = "Yes"
request["noCaption"] = "No"
client.booleanPrompt(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("response" + ": " + (response["response"] as? String).unsafelyUnwrapped)
})
}
文本提示
- API凭证类型:商家
- 所需角色:支付API访问
此API提示客户输入数字或字母数字数据。
由于PCI规则,当响应可以为任何有效字符串时,不允许使用自由格式提示。原因是一个恶意开发者(当然不是您)可能会使用文本提示要求客户输入卡号或PIN码。
这意味着您不是提供提示,而是提供 promptType
。
以下列出了目前支持提示类型
- 电话:捕获电话号码。
- 电子邮件:捕获电子邮件地址。
- 名:捕获名字。
- 姓:捕获姓氏。
- 客户编号:捕获客户编号。
- 奖励编号:捕获奖励编号。
您可以使用 promptType
参数指定提示,响应将返回到 response
字段中。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["promptType"] = PROMPT_TYPE_EMAIL
[client textPromptWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"response", [response objectForKey:@"response"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["promptType"] = PROMPT_TYPE_EMAIL
client.textPrompt(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("response" + ": " + (response["response"] as? String).unsafelyUnwrapped)
})
}
终端列表
- API凭证类型:商家 & 合作伙伴
- 所需角色:终端管理
此API返回与商家账户相关的终端的详细信息。
返回所有终端的状态和资源信息,以及终端上显示的当前品牌图像预览
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
[client terminalsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
client.terminals(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
禁用终端
- API凭证类型:商家 & 合作伙伴
- 所需角色:终端管理
该API用于禁用支付终端。
如果终端存在且当前在线,它将被移除商家的终端库存中。终端将进行远程清除和工厂重置。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalId"] = "<TERMINAL ID>"
[client deactivateTerminalWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalId"] = "<TERMINAL ID>"
client.deactivateTerminal(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
激活终端
- API凭证类型:商家 & 合作伙伴
- 所需角色:终端管理
此API用于激活支付终端。
如果成功,支付终端将重新启动,生成新的加密密钥,并为加入的商户账户下载任何活动品牌资产。
激活请求需要激活码和一个唯一的终端名称。所有终端名称必须在商户账户中唯一。
可选参数
- merchantId: 对于合作伙伴范围的API凭据,需要商户ID。对于商户范围的API凭据,商户ID是隐含的,不能被覆盖。
- cloudRelay: 在云中继模式下激活终端。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
request["activationCode"] = "<ACTIVATION CODE>"
[client activateTerminalWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
request["activationCode"] = "<ACTIVATION CODE>"
client.activateTerminal(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
重启终端
- API凭证类型:商家
- 所需角色:支付API访问
此API重新启动终端。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["terminalName"] = "Test Terminal"
[client rebootWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["terminalName"] = "Test Terminal"
client.reboot(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
术语与条件端点
开发者可以使用BlockChyp展示和捕获与交易相关的合同或协议的接受情况。这些协议可以是从租赁协议到HIPAA披露的任何长期协议。
术语和条件的捕获有两种基本方法。商家可以将合同模板存储在BlockChyp中,或者每次API调用时都发送完整的协议文本。正确的方法主要取决于与BlockChyp集成的系统是否已经具有组织和管理的协议机制。对于已经内置此类功能的系统,可能不需要使用术语和条件。
当协议在终端上显示时,消费者可以滚动阅读整个协议并提供签名。结果作为API响应的一部分返回,但BlockChyp还存储了包含签名图像、时间戳以及同意的协议全文的协议记录。
可以使用术语和条件日志API来搜索和检索接受记录。如果原始API请求中提供了交易ID,这些记录还可以链接到交易。
服务条款捕获
- API凭证类型:商家
- 所需角色:服务条款管理
此API允许您在终端上提示客户提供一项法律协议,并(通常)捕获他们的签名。
协议内容可以通过两种方式指定。您可以引用先前配置的T&C模板,或者每次请求时都传递完整的协议文本。
使用模板
如果您的应用程序不跟踪协议,则可利用BlockChyp的模板系统。您可以在商户仪表板中创建任意数量的T&C模板,并通过传递tcAlias
标志来指定应显示哪个模板。
原始内容
如果您的系统跟踪协议语言或执行复杂的合并和渲染逻辑,则可以绕过我们的模板系统,并在每次交易中传递完整的文本。使用tcName
传递协议名称,并使用tcContent
传递合同文本。请注意,仅支持纯文本。
绕过签名
默认情况下会捕获签名图像。如果出于某种原因,这不适合您的用例,并且您想不实际捕获签名图像就捕获接受,请在请求中设置disableSignature
标志。
服务条款日志
每次用户在接受终端上的协议时,签名图像(如果捕获),将被上传到网关。图像还将附加到日志中,包括协议的全文。这保存了历史记录,以防标准协议或模板随时间改变。
将协议与交易相关联
要将服务条款日志条目与交易相关联,只需传递关联交易的交易ID或交易引用。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
request["tcAlias"] = "hippa"
request["tcName"] = "HIPPA Disclosure"
request["tcContent"] = "Full contract text"
request["sigFormat"] = SIGNATURE_FORMAT_PNG
request["sigWidth"] = 200
request["sigRequired"] = true
[client termsAndConditionsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"sig", [response objectForKey:@"sig"])
NSLog(@"%@: %@", @"sigFile", [response objectForKey:@"sigFile"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
request["tcAlias"] = "hippa"
request["tcName"] = "HIPPA Disclosure"
request["tcContent"] = "Full contract text"
request["sigFormat"] = SIGNATURE_FORMAT_PNG
request["sigWidth"] = 200
request["sigRequired"] = true
client.termsAndConditions(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("sig" + ": " + (response["sig"] as? String).unsafelyUnwrapped)
NSLog("sigFile" + ": " + (response["sigFile"] as? String).unsafelyUnwrapped)
})
}
列表模板
- API凭证类型:商家
- 所需角色:服务条款管理
此API返回与商户账户相关联的所有条款和条件模板。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
[client tcTemplatesWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
client.tcTemplates(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
获取模板
- API凭证类型:商家
- 所需角色:服务条款管理
此API返回单个条款和条件模板。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["templateId"] = "<TEMPLATE ID>"
[client tcTemplateWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["templateId"] = "<TEMPLATE ID>"
client.tcTemplate(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
更新模板
- API凭证类型:商家
- 所需角色:服务条款管理
此 API 用于更新或创建条款和条件模板。
条款和条件模板相对简单,主要包括名称、内容和别名。
名称是将在屏幕顶部显示的标题。别名是用于在后续 API 调用中引用模板的代码或简短描述。
内容是合同的全文。目前不支持特殊格式或合并行为。仅支持纯文本。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["alias"] = "HIPPA"
request["name"] = "HIPPA Disclosure"
request["content"] = "Lorem ipsum dolor sit amet."
[client tcUpdateTemplateWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["alias"] = "HIPPA"
request["name"] = "HIPPA Disclosure"
request["content"] = "Lorem ipsum dolor sit amet."
client.tcUpdateTemplate(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除模板
- API凭证类型:商家
- 所需角色:服务条款管理
此API用于删除条款和条件模板。
如果删除模板,其别名可以被重用,并且由要删除的模板生成的任何先前“条款和条件”日志条目都将被完全保留,因为日志条目总是包含协议文本的完整独立副本。
来自Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["templateId"] = "<TEMPLATE ID>"
[client tcDeleteTemplateWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
来自Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["templateId"] = "<TEMPLATE ID>"
client.tcDeleteTemplate(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
条款和条件日志
- API凭证类型:商家
- 所需角色:服务条款管理
此API允许开发人员搜索和排序条款和条件日志条目。
无参数的默认API调用将按降序返回最后250条日志条目。
可以使用可选参数来过滤和查询数据集。
- transactionId: 如果提供,则仅返回与特定交易相关的日志条目。使用此参数时,会忽略分页和日期过滤器。
- maxResults: 单页中返回的最大结果数量。默认值为250,最大值为250。
- startIndex: 要返回的完整结果集的起始索引,以0为基数。用于前进页面。例如,如果页面大小为10,并且希望返回第二页的结果,则发送startIndex为10。
- startDate: 结果的起始日期,以ISO 8601时间戳 format 提供。 (例如:2022-05-24T13:51:38+00:00)
- endDate:提供结果的可选截止日期,均为ISO 8601时间戳格式。(例如:2022-05-24T13:51:38+00:00)
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["logEntryId"] = "<LOG ENTRY ID>"
[client tcLogWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["logEntryId"] = "<LOG ENTRY ID>"
client.tcLog(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
条款和条件详细信息
- API凭证类型:商家
- 所需角色:服务条款管理
此API返回单个条款和条件日志条目的详细信息。要返回的记录的logEntryId
是唯一必需的参数。
签名图像作为Base 64编码的二进制数据以sigFormat
字段指定的图像格式返回。默认格式是PNG。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["logEntryId"] = "<ENTRY ID>"
[client tcEntryWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["logEntryId"] = "<ENTRY ID>"
client.tcEntry(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
令牌管理
BlockChyp支持通过使用令牌来实现已保存的支付和定期支付。令牌可以通过注册API或网页令牌生成器创建。一旦创建,这些令牌就可以用于后续支付或将它们与客户记录关联为保存的支付方式。
令牌默认情况下限于一笔交易,但通过BlockChyp的特别安排,可以在多地点商家之间共享组织内的令牌。请联系您的BlockChyp代表以设置令牌共享。
注册
- API凭证类型:商家
- 所需角色:支付API访问
此API允许您将支付方式令牌化和注册到令牌保险库。您还可以传递客户信息并将支付方式与客户记录关联。
响应中返回的令牌可以用作后续的充电、预授权和退款交易。
礼品卡和EBT
礼品卡和EBT卡不能进行令牌化。
电子商务令牌
注册API和电子商务网页令牌生成器返回的令牌是相同的,可以互换使用。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
request["terminalName"] = "Test Terminal"
[client enrollWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"approved"];
if (success.boolValue) {
NSLog(@"approved");
}
NSLog(@"%@: %@", @"token", [response objectForKey:@"token"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
request["terminalName"] = "Test Terminal"
client.enroll(withRequest: request, handler: { (request, response, error) in
let approved = response["approved"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("approved")
}
NSLog("token" + ": " + (response["token"] as? String).unsafelyUnwrapped)
})
}
令牌元数据
- API凭证类型:商家
- 所需角色:支付API访问
此API检索令牌的状态和元数据信息,包括与客户记录相关的任何链接。
这还将返回与令牌背后的卡片相关的任何客户记录。如果基础卡片已被多次令牌化,将返回与该卡片相关的所有客户,即使这些客户关系与其他令牌相关也是如此。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["token"] = "<TOKEN>"
[client tokenMetadataWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["token"] = "<TOKEN>"
client.tokenMetadata(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
链接令牌
- API凭证类型:商家
- 所需角色:支付API访问
此API将支付令牌与客户记录关联起来。通常,这只需要撤销之前的解链操作。
从 Objective-C 展示
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["token"] = "<TOKEN>"
request["customerId"] = "<CUSTOMER ID>"
[client linkTokenWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift 展示
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["token"] = "<TOKEN>"
request["customerId"] = "<CUSTOMER ID>"
client.linkToken(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
解除令牌链接
- API凭证类型:商家
- 所需角色:支付API访问
此 API 从客户记录中删除支付令牌链接。
这将删除客户记录和所有同卡令牌之间的链接。
从 Objective-C 展示
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["token"] = "<TOKEN>"
request["customerId"] = "<CUSTOMER ID>"
[client unlinkTokenWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift 展示
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["token"] = "<TOKEN>"
request["customerId"] = "<CUSTOMER ID>"
client.unlinkToken(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除令牌
- API凭证类型:商家
- 所需角色:支付API访问
该API从网关中删除一个支付令牌。如果令牌一年内未被使用,它将被自动删除。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["token"] = "<TOKEN>"
[client deleteTokenWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["token"] = "<TOKEN>"
client.deleteToken(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
客户端点
这些API允许开发者在BlockChyp中创建和管理客户记录。希望使用BlockChyp进行令牌化周期性支付的开发者,如果他们拥有自己的客户管理系统,可以直接使用令牌。然而,BlockChyp还提供了额外的工具来管理客户和跟踪客户保存的支付令牌。
此外,如果使用客户功能,BlockChyp可以检测与现有客户关联的支付方式,并在支付交易中返回客户数据。这可以作为被动方法来检测回头客。
更新客户
- API凭证类型:商家
- 所需角色:支付API访问
该API可以添加或更新客户记录。
如果您传递了包括 firstName
、lastName
、email
或 sms
的客户信息,但没有任何客户ID或客户参考,将会创建一个新的记录。
如果您传递了 customerRef
和 customerId
,如果客户记录存在,它将被更新。
客户参考
《code>customerRef字段是可选的,但强烈推荐使用,因为这允许您使用自己的客户标识符,而不是在您的系统中存储 BlockChyp 的客户 ID。
与支付交易一起创建客户记录
如果在执行支付交易时可以提供客户信息,可以直接将这些客户信息传递到支付交易中。BlockChyp 将在捕捉到付款的同时创建客户记录。这种方法的优点是,客户的支付卡会自动与客户记录相关联,一次性完成。如果客户未来使用这张支付卡,客户数据将自动返回。您无需要求客户提供任何额外信息。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
var customer: [String:Any] = [:]
customer["id"] = "<CUSTOMER ID>"
customer["customerRef"] = "Customer reference string"
customer["firstName"] = "FirstName"
customer["lastName"] = "LastName"
customer["companyName"] = "Company Name"
customer["emailAddress"] = "[email protected]"
customer["smsNumber"] = "(123) 123-1231"
request["customer"] = customer
[client updateCustomerWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"customer", [response objectForKey:@"customer"])
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
var customer: [String:Any] = [:]
customer["id"] = "<CUSTOMER ID>"
customer["customerRef"] = "Customer reference string"
customer["firstName"] = "FirstName"
customer["lastName"] = "LastName"
customer["companyName"] = "Company Name"
customer["emailAddress"] = "[email protected]"
customer["smsNumber"] = "(123) 123-1231"
request["customer"] = customer
client.updateCustomer(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("customer" + ": " + (response["customer"] as? String).unsafelyUnwrapped)
})
}
检索客户
- API凭证类型:商家
- 所需角色:支付API访问
使用此API,您可以检索客户记录的详细信息,包括可用的已保存支付方式。
可以通过customerId
或customerRef
查找客户。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["customerId"] = "<CUSTOMER ID>"
[client customerWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"customer", [response objectForKey:@"customer"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["customerId"] = "<CUSTOMER ID>"
client.customer(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("customer" + ": " + (response["customer"] as? String).unsafelyUnwrapped)
})
}
搜索客户
- API凭证类型:商家
- 所需角色:支付API访问
此API搜索客户数据库并返回匹配的结果。
使用query
传递搜索字符串,系统将返回所有包含查询字符串的姓氏或名。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["query"] = "(123) 123-1234"
[client customerSearchWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
NSLog(@"%@: %@", @"customers", [response objectForKey:@"customers"])
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["query"] = "(123) 123-1234"
client.customerSearch(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
NSLog("customers" + ": " + (response["customers"] as? String).unsafelyUnwrapped)
})
}
删除客户
- API凭证类型:商家
- 所需角色:支付API访问
此API用于删除客户记录。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["customerId"] = "<CUSTOMER ID>"
[client deleteCustomerWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["customerId"] = "<CUSTOMER ID>"
client.deleteCustomer(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
调查参考
这些API用于处理交易后的调查和调查数据。
商家可以选择配置(1-5分)或是/否问题,并在每笔批准的计费和预授权交易后向消费者展示。调查不需要任何自定义编程,商家可以简单地配置它们,无需收银系统进行任何额外定制。
然而,这些API允许收银或第三方系统开发者将其系统集成到自己的系统中以集成调查问题配置或结果可视化。
列出问题
- API凭证类型:商家
- 所需角色:调查管理
此API按照终端上展示问卷问题的顺序返回所有问题。
无论问题是否启用,都会返回所有问题。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
[client surveyQuestionsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
client.surveyQuestions(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
问题详情
- API凭证类型:商家
- 所需角色:调查管理
此API返回一个包含响应数据的单个问卷问题。问题ID
是必需的。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["questionId"] = "<QUESTION ID>"
[client surveyQuestionWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["questionId"] = "<QUESTION ID>"
client.surveyQuestion(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
更新问题
- API凭证类型:商家
- 所需角色:调查管理
此API用于更新或创建调查问题。“questionText”和“questionType”字段是必填项。以下值适用于“questionType”。
- yes_no: 用于简单的“是”或“否”问题。
- scaled: 显示带按钮的问题,允许客户使用从1到5的值进行响应。
问题默认处于禁用状态。传递“enabled”以启用问题。
ordinal
字段用于控制多个问题启用时的顺序。建议保持问题数量最少。
从Objective-C使用
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["id"] = "<QUESTION ID>"
request["ordinal"] = 1
request["questionText"] = "Would you shop here again?"
request["questionType"] = "yes_no"
request["enabled"] = true
[client updateSurveyQuestionWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift使用
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["id"] = "<QUESTION ID>"
request["ordinal"] = 1
request["questionText"] = "Would you shop here again?"
request["questionType"] = "yes_no"
request["enabled"] = true
client.updateSurveyQuestion(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除问题
- API凭证类型:商家
- 所需角色:调查管理
此API用于删除调查问题。“questionId”是一个必填参数。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["questionId"] = "<QUESTION ID>"
[client deleteSurveyQuestionWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["questionId"] = "<QUESTION ID>"
client.deleteSurveyQuestion(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
调查结果
- API凭证类型:商家
- 所需角色:调查管理
该API返回单个问题的调查结果。
返回的结果包括响应率,即在用户提供了答案的交易数百分比。
responses
数组按答案细分结果,提供响应总数、答案所占百分比以及与特定答案相关的平均交易金额。
默认情况下,返回基于所有响应的所有结果。然而,开发者可以可选地提供startDate
和endDate
参数,以返回在某些日期之间提供的响应。
startDate
和endDate
可以以MM/DD/YYYY或YYYY-MM-DD的格式提供。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["questionId"] = "<QUESTION ID>"
[client surveyResultsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["questionId"] = "<QUESTION ID>"
client.surveyResults(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
媒体和品牌控制
BlockChyp具有复杂的终端媒体和品牌控制平台。当终端空闲时,可以配置终端显示标志、图像、视频和幻灯片。品牌资产可以按照精确的按小时的时间表在合作伙伴、组织和商户级别进行配置。
就概念而言,所有品牌和媒体都从媒体库开始。商户、合作伙伴和组织可以上传图像或视频,并从上传的媒体创建品牌资产。
幻灯片可以将媒体库中的图像组合成重复图像的时间循环。
然后可以使用品牌资产来结合媒体或幻灯片,并使用优先级和定时规则来创建我们称之为“终端品牌堆叠”的内容。
我们将一组品牌资产称为“终端品牌堆叠”,因为这些资产有关于优先级的隐含规则。例如,一个未配置品牌资产的商户将继承任何组织设置的品牌规则。如果商户不属于组织或者组织没有配置品牌规则,则系统将依赖于销售点或拥有商户的软件开发合作伙伴设定的默认品牌。
此功能使合作伙伴和组织(多店运营商和大型全国连锁店)能够从单一界面配置数千个终端的品牌。
终端品牌也可以在单个终端级别进行配置,商户的终端车队可以被分成组,并在组级别配置品牌。在终端级别配置的品牌将始终覆盖来自任何更高级别组的品牌。
以下列出了终端品牌堆叠的优先级顺序。
- 终端
- 终端组
- 商户
- 组织(地区、连锁店等)
- 合作伙伴
- BlockChyp默认标志
媒体库
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API返回与API凭证(商家、合作伙伴或组织)关联的整个媒体库。媒体库结果将包括用于在幻灯片和品牌资产中引用媒体资产的ID,以及完整的文件URL和缩略图。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
[client mediaWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
client.media(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
上传媒体
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API支持媒体库上传。此API的操作根据SDK平台有所不同。在所有情况下,的目的都是使用最低级的I/O原语将文件的二进制数据传递到SDK,以支持开发人员不直接处理文件的情况。使用缓冲区、原始字节或流或许更方便。
例如,Go实现在io.Reader
上接受,而Java实现接受java.io.InputStream
。CLI接受通过-file
命令行参数的指定文件URL。
以下文件格式被视为有效上传
- .png
- .jpg
- .jpeg
- .gif
- .mov
- .mpg
- .mp4
- .mpeg
UploadMetadata对象允许开发人员传递有关上传的额外元信息,包括fileName
、fileSize
和uploadId
。
这些值都不是必需的,但提供它们可以解锁一些与媒体上传相关的附加功能。《fileName》将用于记录媒体库中的原始文件名。《fileSize》和《uploadId》用于支持上传状态跟踪,这对于大视频文件上传尤其有用。
fileSize
应该是文件的完整字节大小。
uploadId
的值可以是任何随机字符串。这是您将通过上传状态API检查上传状态的值。该API将返回所需的信息来驱动上传进度反馈,并返回视频转码信息。
从 Objective-C 来看
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["fileName"] = "aviato.png"
request["fileSize"] = 18843
request["uploadId"] = "<RANDOM ID>"
NSData *content = [NSData dataWithContentsOfFile:@"aviato.png"];
[client uploadMediaWithRequest:request content:content handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift 来看
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["fileName"] = "aviato.png"
request["fileSize"] = 18843
request["uploadId"] = "<RANDOM ID>"
var content = Data(contentsOfFile: "aviato.png")
client.uploadMedia(withRequest: request, content: content, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
上传状态
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API返回有关进行中或最近完成的上传的状态和进度信息。
在调用此API之前,开发者必须首先使用fileSize
和uploadId
参数开始文件上传。
返回的数据结构将包括文件大小、已上传字节数、叙述状态以及指示上传是否完成或上传后处理正在进行中的标志。
如果上传完成,还将返回分配给媒体资产的ID以及缩略图的链接。
从 Objective-C 来看
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["uploadId"] = "<UPLOAD ID>"
[client uploadStatusWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["uploadId"] = "<UPLOAD ID>"
client.uploadStatus(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
获取媒体资源
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API返回一个详细的媒体资源。返回数据包括与完整的媒体库端点返回的相同的媒体信息,包括指向原始媒体文件和缩略图的完全限定URL。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["mediaId"] = "<MEDIA ASSET ID>"
[client mediaAssetWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["mediaId"] = "<MEDIA ASSET ID>"
client.mediaAsset(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除媒体资源
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API用于删除媒体资源。请注意,如果媒体资源在一个幻灯片演示或终端品牌堆栈中使用,则无法删除。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["mediaId"] = "<MEDIA ASSET ID>"
[client deleteMediaAssetWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["mediaId"] = "<MEDIA ASSET ID>"
client.deleteMediaAsset(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
播放列表
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API返回所有幻灯片。
注意,使用此API不会返回幻灯片级别的数据。请使用“获取幻灯片”API来获取幻灯片级别的详细信息。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
[client slideShowsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
client.slideShows(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
获取幻灯片放映
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API返回单个幻灯片放映。每个幻灯片的详细级别以及完全限定的缩略图URL都会返回。
必须的参数为 slideShowId
。
从Objective-C获取
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["slideShowId"] = "<SLIDE SHOW ID>"
[client slideShowWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift获取
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["slideShowId"] = "<SLIDE SHOW ID>"
client.slideShow(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
更新幻灯片放映
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API可以更新或创建幻灯片放映。name
、delay
和slides
都是必要的。
幻灯片属性是一个包含幻灯片的数组。幻灯片数据结构有顺序号和缩略图URL字段,但更新或创建幻灯片放映时这些字段不是必需的。更新或创建幻灯片放映时,必须提供mediaId
字段。
在使用命令行界面(CLI)时,可以通过发送逗号分隔的媒体ID列表,使用-mediaId
参数来指定幻灯片。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["name"] = "Test Slide Show"
request["delay"] = 5
var slides = [Any]();
var slides1: [String:Any] = [:]
slides1["mediaId"] = "<MEDIA ID>"
slides.append(slides1)
request["slides"] = slides
[client updateSlideShowWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["name"] = "Test Slide Show"
request["delay"] = 5
var slides = [Any]();
var slides1: [String:Any] = [:]
slides1["mediaId"] = "<MEDIA ID>"
slides.append(slides1)
request["slides"] = slides
client.updateSlideShow(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除幻灯片放映
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API删除幻灯片放映,slideShowId
是唯一必需的参数。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["slideShowId"] = "<SLIDE SHOW ID>"
[client deleteSlideShowWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["slideShowId"] = "<SLIDE SHOW ID>"
client.deleteSlideShow(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
终端品牌化
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API返回给定API作用域中的完整品牌堆栈,顺序按照优先级。
使用此API的用户应特别注意可编辑
字段。此字段表示品牌资产是否可以从特定API凭证作用域的角度读取。
缩略图
和预览图像
属性可以用于支持构建管理品牌堆栈的用户界面。预览图像
与缩略图
不同之处在于,预览图像旨在显示资产在终端上实际显示时的外观。
activeAsset
返回终端上当前可见的资产。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
[client terminalBrandingWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
client.terminalBranding(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
更新品牌资产
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
此API用于更新或创建单个品牌资产。
品牌资产代表终端品牌堆栈的单个元素。品牌资产可以是一个视频或图片,在这种情况下,必须提供引用媒体库中资产的mediaId
。品牌资产也可以是一个幻灯片,在这种情况下必须提供slideShowId
。品牌资产必须具有有效的mediaId
或有效的slideShowId
。可选的notes
字段可以用来为品牌资产提供简短说明和描述。
可见性标志
为了使品牌资产在终端上可见,必须将enabled
标志设置为true,并将preview
关闭。preview
的目的是在不推送到活终端的情况下展示提议的品牌资产的行为。BlockChyp商户门户中的发布按钮实际上关闭了preview
设置。
顺序和排序
ordinal
字段用于指定品牌资产的优先级。具有较高ordinal
值的资产将优先排序。
填充图像
对于普通图像,添加边距有时很有帮助。这对于没有在图像内容与图像文件边缘之间留有空白或边距的标志或任何图像文件尤其有用。如果您希望BlockChyp在终端显示图像时自动应用边距,请将padded
标志设置为true。
调度
默认情况下,放置在品牌堆栈上的品牌资产,如果已启用且不在preview
模式下,将全天24小时在终端上显示。
品牌资产可以按季节性活动的有效开始和结束日期进行调度。这些资产还可以按特定时间和特定周进行调度。
- startDate: 可选日期,在此日期之后品牌资产才有资格显示。可以提供为MM/DD/YYYY或YYYY-MM-DD格式。
- endDate: 可选日期,在此日期之前品牌资产才有资格显示。可以提供为MM/DD/YYYY或YYYY-MM-DD格式。
- startTime: 可选时间,在此时间之后品牌资产才有资格显示。必须是24小时时间:HH:MM。
- endTime: 可选时间,在此时间之前品牌资产才有资格显示。必须是24小时时间格式:HH:MM。
- daysOfWeek: 对于仅在特定工作日显示的品牌资产,此字段是工作日常量的数组。(常量因SDK平台而异。)
只读字段
当检索品牌资产时,品牌资产数据结构包含多个只读字段。但尝试将其作为更新的一部分发送时将忽略这些字段。这些是导出或计算字段,有助于在管理用户界面中显示品牌资产,但不能通过API调用来更改。
这些字段包括
- ownerId
- merchantId
- organizationId
- partnerId
- userId
- userName
- thumbnail
- lastModified
- editable
- assetType
- ownerType
- ownerTypeCaption
- previewImage
- narrativeEffectiveDates
- narrativeDisplayPeriod
从Objective-C获取
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["mediaId"] = "<MEDIA ID>"
request["padded"] = true
request["ordinal"] = 10
request["startDate"] = "01/06/2021"
request["startTime"] = "14:00"
request["endDate"] = "11/05/2024"
request["endTime"] = "16:00"
request["notes"] = "Test Branding Asset"
request["preview"] = false
request["enabled"] = true
[client updateBrandingAssetWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["mediaId"] = "<MEDIA ID>"
request["padded"] = true
request["ordinal"] = 10
request["startDate"] = "01/06/2021"
request["startTime"] = "14:00"
request["endDate"] = "11/05/2024"
request["endTime"] = "16:00"
request["notes"] = "Test Branding Asset"
request["preview"] = false
request["enabled"] = true
client.updateBrandingAsset(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除品牌资产
- API凭证类型:商家、合作伙伴及组织
- 所需角色:媒体管理
该 API 从品牌堆栈中删除品牌资产。
请注意,删除品牌资产不会从媒体库或幻灯片库中删除底层媒体或幻灯片。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["assetId"] = "<BRANDING ASSET ID>"
[client deleteBrandingAssetWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["assetId"] = "<BRANDING ASSET ID>"
client.deleteBrandingAsset(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
商户管理
这些 API 允许合作伙伴管理和配置他们的商户组合。
除商户资料 API 之外,使用这些 API(需要 BlockChyp 特殊安排的角色和权限的合作伙伴范围 API 凭据)。
例如,合作伙伴通常无法直接登船商户,而必须通过提供码和邀请使用标准承保流程登船商户。
商家资料
- API凭证类型:商家
- 所需角色:支付API访问
API 返回关于商家配置的详细元数据,包括基本身份信息、终端设置、店铺和转发设置以及支持分账的商家的银行账户信息。
其中一些字段可以通过更新商家 API 进行更新,但许多字段由承保控制,无法在承保和风险流程之外更改。
商家描述性字段
以下字段是基本描述性字段,可以用来描述和识别商家。
- companyName: 商家的官方公司实体名称。
- dbaName: 商业的 DBA (Doing Business As) 名称。
- contactName: 商家主要控制联系人的姓名。
- contactNumber: 主要控制联系人的电话号码。
- locationName: 多门店运营商的可选位置名称。
- storeNumber: 多门店运营商的可选门店号码。
- partnerRef: 合作伙伴可以添加到商家记录的可选参考编号。通常是合作伙伴对商家的自身标识符。
- timeZone: 商家的 Unix 风格本地时区。例如:America/New_York。
- publicKey: 读取-only 字段。商家的区块链公钥。在首次创建商家账户时生成和分配。
- billingAddress: 计费和书面通信的地址。
- shippingAddress: 实际的物理送货地址。通常是商业的实际街道地址。
- status: 商家账户的当前状态。
- tcDisabled: 禁用商家仪表板中的所有条款和条件功能。如果合作伙伴没有选择支持它,则用于隐藏该功能。
- gatewayOnly: 指示商家只以网关模式加入。不常见。
批量和终端设置
以下字段用于控制批量关闭和高级终端配置。
- batchCloseTime: 批量将在当地时间的 24 小时 HH:MM 格式下自动关闭的时间。默认为凌晨 3 点。
- autoBatchClose: 标志用于确定是否自动关闭批量。默认为 true。
- disableBatchEmails: 标志可选地关闭自动批量关闭通知电子邮件。
- cooldownTimeout: 在终端上显示交易响应后,在了一定时间的交易后的秒数。在冷却时间结束后,终端将回退到空闲状态,并显示当前活动的终端品牌。
- surveyTimeout: 在终端上显示调查问题之前的秒数,之后将回退到空闲屏幕。
- pinEnabled: 为借记卡、EBT 卡和具有 pin CVM 的 EMV 卡启用 pin 码输入。如果终端未注入正确的加密密钥,将被忽略。
- pinBypassEnabled: 为借记交易启用 pin 绕过。
- cashBackEnabled: 为借记交易启用现金退款。
- cashbackPresets: 当启用现金退款时,对于现金退款金额的四组默认值。
- storeAndForwardEnabled: 在网络中断期间启用自动存储和转发。存储和转发不支持现金退款、退款、EBT 或礼品卡交易。
- storeAndForwardFloorLimit: 存储和转发交易的美元最大价值。
- ebtEnabled: 启用BlockChyp终端上的EBT(SNAP)功能。
- tipEnabled: 启用终端上的小费输入。
- promptForTip: 如果为true,即使API调用未请求小费提示,终端也会始终提示输入小费。
- tipDefaults: 包含三个百分比的数组,将用于计算默认小费金额。
- giftCardsDisabled: 禁用BlockChyp礼品卡。通常仅在商户使用替代礼品卡系统时使用。
- digitalSignaturesEnabled: 启用磁条卡和带有签名CVM的EMV卡的电子签名捕获。
- digitalSignatureReversal: 如果消费者拒绝提供签名,将自动撤销交易。
- manualEntryEnabled: 启用手动卡输入。
- manualEntryPromptZip: 对于手动卡输入,需要基于邮编进行地址验证。
- manualEntryPromptStreetNumber: 对于手动卡输入,需要基于街道/地址进行验证。
卡片品牌和交易设置
- freeRangeRefundsEnabled: 启用直接退款,无需引用之前的交易。
- partialAuthEnabled: 指示已启用部分授权(通常用于礼品卡支持)。
- splitBankAccountsEnabled: 仅供律师事务所商户使用。
- contactlessEmv: 启用终端上的非接触/触摸交易。默认为true。
- visa: 启用Visa交易。
- masterCard: 启用万事达卡交易。
- amex: 启用美国运通卡交易。
- discover: 启用发现卡交易。
- jcb: 启用JCB(日本信用卡局)交易。
- unionPay: 启用中国银联交易。
从Objective-C中来
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
[client merchantProfileWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift中来
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
client.merchantProfile(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
获取商户
- API凭证类型:合作伙伴 & 组织
- 所需角色:商户管理
这是一个合作伙伴或组织级别的API,可用于返回商户组合。
默认返回活动商户。使用 test
标志只返回测试商户。返回的结果包括包括承保控制的详细设置。
默认最多返回250家商户。对于大型商户组合,可以使用 maxResults
和 startIndex
字段来减小页面大小并分页展示多个结果页面。
从Objective-C来
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["test"] = true
[client getMerchantsWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift来
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["test"] = true
client.getMerchants(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
更新商户
- API凭证类型:商家、合作伙伴及组织
- 所需角色:商户管理
此API可用于更新或创建商户账户。
可用商户范围API凭证更新商户账户设置。
可用合作伙伴范围API凭证更新商户、创建新的测试商户或引入新的网关商户。
商家描述性字段
以下字段是基本描述性字段,可以用来描述和识别商家。
- companyName: 商家的官方公司实体名称。
- dbaName: 业务的DBA(作为)名称。
- contactName: 商家主要控制联系人的姓名。
- contactNumber: 主要控制联系人的电话号码。
- locationName: 多地点运营商可选的地点名称。
- storeNumber: 多地点运营商可选的商店编号。
- partnerRef: 合作伙伴可以添加到商家记录的可选参考编号。通常是合作伙伴对商家的自身标识符。
- timeZone: 商家的 Unix 风格本地时区。例如:America/New_York。
- publicKey: 读取-only 字段。商家的区块链公钥。在首次创建商家账户时生成和分配。
- billingAddress: 计费和书面通信的地址。
- shippingAddress: 实际的物理送货地址。通常是商业的实际街道地址。
- status: 商家账户的当前状态。
- tcDisabled: 禁用商家仪表板中的所有条款和条件功能。如果合作伙伴没有选择支持它,则用于隐藏该功能。
- gatewayOnly: 指示商家只以网关模式加入。不常见。
批量和终端设置
以下字段用于控制批量关闭和高级终端配置。
- batchCloseTime: 批量将在当地时间的 24 小时 HH:MM 格式下自动关闭的时间。默认为凌晨 3 点。
- autoBatchClose: 标志用于确定是否自动关闭批量。默认为 true。
- disableBatchEmails: 标志可选地关闭自动批量关闭通知电子邮件。
- cooldownTimeout: 在终端上显示交易响应后,在了一定时间的交易后的秒数。在冷却时间结束后,终端将回退到空闲状态,并显示当前活动的终端品牌。
- surveyTimeout: 在终端上显示调查问题之前的秒数,之后将回退到空闲屏幕。
- pinEnabled: 为借记卡、EBT 卡和具有 pin CVM 的 EMV 卡启用 pin 码输入。如果终端未注入正确的加密密钥,将被忽略。
- pinBypassEnabled: 为借记交易启用 pin 绕过。
- cashBackEnabled: 为借记交易启用现金退款。
- cashbackPresets: 当启用现金退款时,对于现金退款金额的四组默认值。
- storeAndForwardEnabled: 在网络中断期间启用自动存储和转发。存储和转发不支持现金退款、退款、EBT 或礼品卡交易。
- storeAndForwardFloorLimit: 存储和转发交易的美元最大价值。
- ebtEnabled: 启用BlockChyp终端上的EBT(SNAP)功能。
- tipEnabled: 启用终端上的小费输入。
- promptForTip: 如果为true,即使API调用未请求小费提示,终端也会始终提示输入小费。
- tipDefaults: 包含三个百分比的数组,将用于计算默认小费金额。
- giftCardsDisabled: 禁用BlockChyp礼品卡。通常仅在商户使用替代礼品卡系统时使用。
- digitalSignaturesEnabled: 启用磁条卡和带有签名CVM的EMV卡的电子签名捕获。
- digitalSignatureReversal: 如果消费者拒绝提供签名,将自动撤销交易。
- manualEntryEnabled: 启用手动卡输入。
- manualEntryPromptZip: 对于手动卡输入,需要基于邮编进行地址验证。
- manualEntryPromptStreetNumber: 对于手动卡输入,需要基于街道/地址进行验证。
卡片品牌和交易设置
- freeRangeRefundsEnabled: 启用直接退款,无需引用之前的交易。
- partialAuthEnabled: 指示已启用部分授权(通常用于礼品卡支持)。
- splitBankAccountsEnabled: 仅供律师事务所商户使用。
- contactlessEmv: 启用终端上的非接触/触摸交易。默认为true。
- visa: 启用Visa交易。
- masterCard: 启用万事达卡交易。
- amex: 启用美国运通卡交易。
- discover: 启用发现卡交易。
- jcb: 启用JCB(日本信用卡局)交易。
- unionPay: 启用中国银联交易。
从Objective-C来
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["merchantId"] = "<MERCHANT ID>"
request["test"] = true
request["dbaName"] = "Test Merchant"
request["companyName"] = "Test Merchant"
var billingaddress: [String:Any] = [:]
billingaddress["address1"] = "1060 West Addison"
billingaddress["city"] = "Chicago"
billingaddress["stateOrProvince"] = "IL"
billingaddress["postalCode"] = "60613"
request["billingAddress"] = billingaddress
[client updateMerchantWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["merchantId"] = "<MERCHANT ID>"
request["test"] = true
request["dbaName"] = "Test Merchant"
request["companyName"] = "Test Merchant"
var billingaddress: [String:Any] = [:]
billingaddress["address1"] = "1060 West Addison"
billingaddress["city"] = "Chicago"
billingaddress["stateOrProvince"] = "IL"
billingaddress["postalCode"] = "60613"
request["billingAddress"] = billingaddress
client.updateMerchant(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
商户用户
- API凭证类型:合作伙伴 & 组织
- 所需角色:商户管理
此 API 返回与商户账户关联的所有用户和悬停邀请,包括任何分配的角色代码。
从 Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["merchantId"] = "<MERCHANT ID>"
[client merchantUsersWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从 Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["merchantId"] = "<MERCHANT ID>"
client.merchantUsers(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
邀请商户用户
- API凭证类型:合作伙伴 & 组织
- 所需角色:商户管理
邀请一个新用户加入商户账户。请提供 `email`、`firstName` 和 `lastName`。
用户将收到一封邀请邮件,其中包含创建BlockChyp账户并将其链接到商户账户的步骤。如果用户已有BlockChyp用户账户,则将跳过新用户注册步骤,并将现有用户账户链接到商户账户。
开发人员可以通过发送一个或多个角色代码来选择性地限制用户的访问级别。否则,用户将被赋予默认的商户用户角色。(STDMERCHANT)
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["email"] = "Email address for the invite"
[client inviteMerchantUserWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["email"] = "Email address for the invite"
client.inviteMerchantUser(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
添加测试商户
- API凭证类型:合作伙伴
- 所需角色:商户管理
这是一个合作伙伴级别的API,可用于创建测试商户账户。这将创建一个具有默认设置的测试商户。
可以通过使用更新商户API来更改设置。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["dbaName"] = "DBA Name"
request["companyName"] = "Corporate Entity Name"
[client addTestMerchantWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["dbaName"] = "DBA Name"
request["companyName"] = "Corporate Entity Name"
client.addTestMerchant(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
删除测试商户
- API凭证类型:合作伙伴
- 所需角色:商户管理
此合作伙伴API可用于删除未使用的测试商户账户。 merchantId
是必填参数。
从Objective-C
#import <Foundation/Foundation.h>
#import <BlockChyp/BlockChyp.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BlockChyp *client = [[BlockChyp alloc]
initWithApiKey:@"SPBXTSDAQVFFX5MGQMUMIRINVI"
bearerToken:@"7BXBTBUPSL3BP7I6Z2CFU6H3WQ"
signingKey:@"bcae3708938cb8004ab1278e6c0fcd68f9d815e1c3c86228d028242b147af58e"];
NSMutableDictionary *request = [[NSMutableDictionary alloc] init];
request["merchantId"] = "<MERCHANT ID>"
[client deleteTestMerchantWithRequest:request handler:^(NSDictionary *request, NSDictionary *response, NSError *error) {
NSNumber *success = [response objectForKey:@"success"];
if (success.boolValue) {
NSLog(@"Success");
}
}];
[pool drain];
return 0;
}
从Swift
import BlockChyp
class ExampleClass {
func example() {
let client = BlockChyp.init(
apiKey: "ZN5WQGX5PN6BE2MF75CEAWRETM",
bearerToken: "SVVHJCYVFWJR2QKYKFWMZQVZL4",
signingKey: "7c1b9e4d1308e7bbe76a1920ddd9449ce50af2629f6bb70ed3c110365935970b"
)
var request: [String:Any] = [:]
request["merchantId"] = "<MERCHANT ID>"
client.deleteTestMerchant(withRequest: request, handler: { (request, response, error) in
let approved = response["success"] as? Bool
if (approved.unsafelyUnwrapped) {
NSLog("Success")
}
})
}
运行集成测试
如果您想运行集成测试,请在您的系统中创建一个新的文件,命名为 sdk-itest-config.json
,并包含您将要使用的API凭证。下面是一个示例。
{
"gatewayHost": "https://api.blockchyp.com",
"testGatewayHost": "https://test.blockchyp.com",
"apiKey": "PZZNEFK7HFULCB3HTLA7HRQDJU",
"bearerToken": "QUJCHIKNXOMSPGQ4QLT2UJX5DI",
"signingKey": "f88a72d8bc0965f193abc7006bbffa240663c10e4d1dc3ba2f81e0ca10d359f5"
}
此文件可以位于几个不同的位置,但通常位于 <USER_HOME>/.config/blockchyp/sdk-itest-config.json
。所有BlockChyp SDK都使用相同的配置文件。
要使用 make
运行集成测试套件,请输入以下命令:
make integration
通过命令行运行集成测试
如果您想从xcode命令行运行整个集成测试套件,请打开一个终端窗口并将cd到 blockchyp-ios
目录。
在blockchyp-ios目录中,运行以下命令以执行所有测试。
xcodebuild test -project blockchyp-ios.xcodeproj -scheme Tests -destination 'platform=iOS Simulator,name=iPad (7th generation)'
请注意,用于大多数SDK的BC_TEST_DELAY环境变量设置在iOS中不被使用。测试延迟已集成到iOS的Test schema配置中。
要执行单个测试,添加 -only-testing
参数,如下所示。
xcodebuild test -project blockchyp-ios.xcodeproj -scheme Tests -destination 'platform=iOS Simulator,name=iPad (7th generation)' -only-testing:Tests/TerminalChargeTest
贡献
BlockChyp欢迎开源社区的贡献,但请注意,此存储库是由我们的内部SDK生成器工具生成的。如果我们选择接受PR或贡献,您的代码将被移动到我们的SDK生成器项目,该项目是一个私有存储库。
许可
版权所有 BlockChyp, Inc., 2019
遵照MIT许可证分发,blockchyp-ios是免费和开源软件。
其他SDK
BlockChyp正式支持八个不同开发平台及其以上的SDK。以下是完整列表和其GitHub仓库链接。