您是否需要在不同国家接受来自移动用户的付款,并考虑哪种付款方式最适合?PWLocal 是一个全球支付网关,使得您能够轻松地接受来自 200 多个国家的客户使用 100 多种替代付款方式的付款。PWLocal iOS SDK 将成为您应用程序的本地部分,消除了在付费时打开网络浏览器的必要性,从而提高了您的转化率。您只需要将库导入到您的 iOS 项目中,并开始使用我们的 SDK 接受应用内付款。这既快又简单!我们在下面为您指导整个流程。
您的移动集成需要项目密钥。
您可以从 Paymentwall 的商户账户设置中获取这些 Paymentwall API 凭证,请在 Paymentwall 的应用程序设置中进行操作。
#import "PWLocalSDK.h"
将此命令添加到您的 Bridging-Header.h
文件中
#import "PWLocalSDK.h"
我们支持四种类型的 PWLocal 支付请求:VituralCurrency
、DigitalGoodsDefautWidget
、DigitalGoodsFlexibleWidget
和 CartDefaultWidget
。我们支持三种 API 类型:VIRTUAL_CURRENCY
、DIGITAL_GOODS_FLEXIBLE
、DIGITAL_GOODS_DEFAULT
、CART
。更多信息请参考:https://www.paymentwall.com/en/documentation/Digital-Goods-API/710
我们定义了四种请求类型:VituralCurrency
、DigitalGoodsDefautWidget
、DigitalGoodsFlexibleWidget
和 CartDefaultWidget
。您可以通过设置器简单地设置所需的参数。请注意,所有参数都从下划线命名格式更改为驼峰式命名格式。
DigitalGoodsDefautWidget *digitalGoodsdefaultWidget = [DigitalGoodsDefautWidget new];
digitalGoodsdefaultWidget.key = PROJECT_KEY;
digitalGoodsdefaultWidget.uid = USER_ID;
digitalGoodsdefaultWidget.widget = WIDGET_TYPE;
let digitalGoodsdefaultWidget = DigitalGoodsDefautWidget()
digitalGoodsdefaultWidget.key = PROJECT_KEY
digitalGoodsdefaultWidget.uid = USER_ID
digitalGoodsdefaultWidget.widget = WIDGET_TYPE
如果我们定义的请求不符合您的需求。我们也支持使用 NSDictionary 并带有键和值的自定义请求,您可以自行处理,它遵循 https://www.paymentwall.com/en/documentation/Digital-Goods-API/710 中的参数。
NSMutableDictionary *customSetting = [NSMutableDictionary new];
[customSetting setObject: PROJECT_KEY forKey:@"key"];
[customSetting setObject: USER_ID forKey:@"uid"];
[customSetting setObject: WIDGET_TYPE forKey:@"widget"];
var customSetting = [String: String]()
customSetting["key"] = PROJECT_KEY
customSetting["uid"] = USER_ID
customSetting["widget"] = WIDGET_TYPE
[PWLocalSDK showPWLocalViewControllerWithViewController:self
delegate:self
type:DIGITAL_GOODS_FLEXIBLE
params:digitalGoodsdefaultWidget
secretKey:SECRET_KEY];
PWLocalSDK.showPWLocalViewController(with: self,
delegate: self,
type: .DIGITAL_GOODS_FLEXIBLE,
params: digitalGoodsdefaultWidget,
secretKey: SECRET_KEY)
[PWLocalSDK showPWLocalViewControllerWithViewController:self
delegate:self
type:DIGITAL_GOODS_FLEXIBLE
params:customSetting
secretKey:SECRET_KEY];
PWLocalSDK.showPWLocalViewController(with: self,
delegate: self,
type: .DIGITAL_GOODS_FLEXIBLE,
params: customSetting,
secretKey: SECRET_KEY)
将 secretKey
存储在自己的后端可以降低泄露风险。远程签名您的请求是推荐的做法以确保您的项目安全。您可以使用此方法获取完整的排序字符串,您只需要在末尾添加密钥来计算签名,params
可以是字典或任何预制的类。
NSString *stringToSign = [PWLocalSDK getStringToSign:params];
let stringToSign = PWLocalSDK.getStringToSign(params)
注意:如果您的
params
没有包含,此函数默认会添加 Param"success_url"="pwlocal://paymentsuccessful"
,如果您使用自己的webView,请跟踪此值以关闭webView。
请注意,如果您想使用自己的webview来显示小部件,您需要在请求中添加一些额外的标题,使用以下方法来获取它们并将它们添加到您的可变请求中:[request setValue:value forHTTPHeaderField:key]
NSDictionary *extra = [PWLocalSDK getExtraHeaders];
let extra = PWLocalSDK.getExtraHeaders()
您必须将PWLocalSDKDelegate添加到您的ViewController中
@interface YourViewController : UIViewController <PWLocalSDKDelegate>
class YourViewController: UIViewController, PWLocalSDKDelegate
您可以通过定义回调函数来处理支付结果。建议在此处与您的服务器同步,以同步用户的余额、确认购买项目等。请参阅示例
#pragma mark - PWLocal Response
-(void)pwLocalResponse:(PWLocalResponse *)response {
switch (response.code) {
case PWLOCAL_SUCCESSFUL:
break;
case PWLOCAL_FAILED:
break;
case PWLOCAL_CANCELED:
break;
default:
break;
}
}
// MARK: - PWLocal Response
func pwLocalResponse(response: PWLocalResponse!) {
switch response.code {
case .PWLOCAL_SUCCESSFUL:
break
case .PWLOCAL_CANCELED:
break
case .PWLOCAL_FAILED:
break
}
}
response.code
代码可以有以下值之一
PWLOCAL_SUCCESSFUL
:用户已完成支付
PWLOCAL_CANCELED
:用户已取消支付
PWLOCAL_FAILED
:由于某些错误无法完成支付
我们的SDK也支持支付状态API。
#pragma mark - PWLocal Get Payment Status
[PWLocalSDK checkPaymentStatusWithKey:PROJECT_KEY
agExternalId:A_EXTERNAL_ID
uid:UID
signVersion:0
andSecretKey:@""
completion:^(PWLocalStatusResponse *response) {
if(response.code == PWLOCAL_STAUTS_SUCCESSFUL) {
if(response.dataResponse.count > 0) PaymentStatus *paymentStatus = response.dataResponse.firstObject;
}
}
else
NSLog(@"%@", response.message);
}];
// MARK: - PWLocal Get Payment Status
PWLocalSDK.checkPaymentStatusWithKey(PROJECT_KEY, agExternalId: A_EXTERNAL_ID, uid: UID, signVersion: 0, andSecretKey: "", completion: {
(response) -> Void in
})
#pragma mark - PWLocal Get Payment Status
[PWLocalSDK checkPaymentStatusWithKey:PROJECT_KEY
agExternalId:A_EXTERNAL_ID
uid:UID
signVersion:SIGN_VERSION
andSecretKey:SECRET_KEY
completion:^(PWLocalStatusResponse *response) {
if(response.code == PWLOCAL_STAUTS_SUCCESSFUL) {
if(response.dataResponse.count > 0) PaymentStatus *paymentStatus = response.dataResponse.firstObject;
}
}
else
NSLog(@"%@", response.message);
}];
// MARK: - PWLocal Get Payment Status
PWLocalSDK.checkPaymentStatusWithKey(PROJECT_KEY, agExternalId: A_EXTERNAL_ID, uid: UID, signVersion: SIGN_VERSION, andSecretKey: SECRET_KEY, completion: {
(response) -> Void in
})
每次成功的支付后,我们都会通知您的服务器。我们建议使用此功能,因为它是最可靠的了解支付是否成功通过的方式。即使您的应用程序因某种原因崩溃,您的服务器仍会收到通知,因此您可以稍后同步。有关更多信息,请参阅pingback处理文档。
以下是定义请求中支持的参数列表
数据类型 | 参数 |
NSString | key |
NSString | uid |
NSString | widget |
NSString | ps |
NSString | sign_version |
NSString | birthday |
NSString | |
NSString | sex |
NSString | evaluation |
NSString | location_city |
NSString | location_state |
NSString | location_address |
NSString | location_country |
NSString | location_zip |
NSString | 国家代码 |
NSString | rv |
NSString | th |
NSString | tm |
NSString | pingback_url |
NSString | success_url |
数据类型 | 参数 |
NSString | key |
NSString | uid |
NSString | widget |
NSString | ps |
NSString | ts |
NSString | sign_version |
NSString | birthday |
NSString | 国家代码 |
NSString | |
NSString | sex |
NSString | evaluation |
NSString | firstname |
NSString | lang |
NSString | lastname |
NSString | location_city |
NSString | location_state |
NSString | location_address |
NSString | location_country |
NSString | location_zip |
NSString | default_goodsid |
NSString | display_goodsid |
NSArray | hide_goodsid |
NSString | pingback_url |
NSString | success_url |
数据类型 | 参数 |
NSString | key |
NSString | uid |
NSString | widget |
NSString | 金额 |
NSString | currencyCode |
NSString | ps |
NSString | ts |
NSString | ag_name |
NSString | ag_external_id |
NSString | ag_type |
NSString | ag_period_length |
NSString | ag_period_type |
NSString | ag_recurring |
NSString | ag_promo |
NSString | ag_trial |
NSString | ag_post_trial_period_length |
NSString | ag_post_trial_period_type |
NSString | ag_post_trial_external_id |
NSString | post_trial_amount |
NSString | post_trial_currencyCode |
NSString | ag_post_trial_name |
NSString | hide_post_trial_good |
NSString | sign_version |
NSString | birthday |
NSString | 国家代码 |
NSString | |
NSString | sex |
NSString | evaluation |
NSString | firstname |
NSString | lang |
NSString | lastname |
NSString | location_city |
NSString | location_state |
NSString | location_address |
NSString | location_country |
NSString | location_zip |
NSString | show_trial_non_recurring |
NSString | show_trial_recurring |
NSString | show_post_trial_non_recurring |
NSString | show_post_trial_recurring |
NSString | pingback_url |
NSString | success_url |
数据类型 | 参数 |
NSString | key |
NSString | uid |
NSString | widget |
NSString | 外部ID |
NSString | 价格 |
NSString | 货币 |
NSString | firstname |
NSString | lastname |
NSString | sign_version |
NSString | birthday |
NSString | |
NSString | sex |
NSString | evaluation |
NSString | location_city |
NSString | location_state |
NSString | location_address |
NSString | location_country |
NSString | location_zip |
NSString | pingback_url |