支付
业务场景
游戏内购买商品、月卡等游戏资源的时候需要调用本支付接口。用户支付成功后,由 SDK 服务端通知 CP 服务端进行发货处理。
注意事项
- 需在 SDK 登录成功后调用
- 客户端上报的
RoleInfo
中的ServerId
需与服务端支付时参与签名的ServerId
一致,否则支付失败
流程图
接口介绍
/**
* 支付
*
* @param orderInfo 支付参数
*/
- (void)pay:(OrderInfo *)orderInfo;
调用示例
// 监听支付回调通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPaymentCompleted:) name:NOTIFICATION_PAY_SUCCESS object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPaymentFailed:) name:NOTIFICATION_PAY_FAILED object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPaymentCancel:) name:NOTIFICATION_PAY_CANCEL object:nil];
// 调用支付接口
RoleInfo *roleInfo = [[RoleInfo alloc] init];
roleInfo.serverId = @"99"; // 游戏区服ID
roleInfo.serverName = @"测试1服"; // 游戏区服名称
roleInfo.roleId = @"101"; // 角色ID
roleInfo.roleName = @"只好简化"; // 角色名称
roleInfo.roleLevel = @"66"; // 角色等级
roleInfo.combatValue = @""; // 角色战力
roleInfo.roleVipLevel = @""; // 角色vip等级
roleInfo.roleCreateTime = @""; // 角色创建时间
roleInfo.properties = @""; // 角色资产
roleInfo.gameResVersion = @""; // 游戏资源版本
OrderInfo *orderInfo = [[OrderInfo alloc] init];
orderInfo.amount = @"0.99"; // 当前档位对应的充值金额(单位:元,与currency配对),传入从商品列表接口中获取price
orderInfo.currency = @"USD"; // 币种,传入从商品列表接口中获取currency
orderInfo.roleInfo = roleInfo; // 角色信息
orderInfo.orderNo = @"549255118261248"; // 当前档位对应的CP订单号,在服务端的支付回调通知里面SDK会原样透传给游戏侧
orderInfo.productName = @"0.99礼包"; // 当前档位对应的商品名称
orderInfo.productCount = 1; // 当前档位对应的商品数量,默认为:1
orderInfo.extend = @"549255118261248"; // 拓展字段,在服务端的支付回调通知里面SDK会原样透传给游戏侧
orderInfo.productId = @"1"; // 当前档位对应的商品id
orderInfo.taskNum = 0; // 小游戏使用的标识,默认传0
orderInfo.extstr = @""; // 小游戏使用的标识,默认传@""
orderInfo.sign = sign; // 支付验签参数,具体请查看服务端接入文档中的[下单校验]章节
[SDKManager.getInstance pay:orderInfo];
// 支付回调
- (void)onPaymentCompleted:(NSNotification *)notif
{
[self textViewLog:[NSString stringWithFormat:@"支付完成"]];
// 支付完成
// 仅表示用户的支付操作完成,实际的到账结果以服务端的支付回调通知为准
}
- (void)onPaymentFailed:(NSNotification *)notif
{
NSDictionary *errorInfo = notif.userInfo;
NSString *errorMsg = [errorInfo objectForKey:KEY_ERROR_MSG];
NSInteger errorCode = [[errorInfo objectForKey:KEY_ERROR_CODE] integerValue];
// 支付失败, errorInfo返回了失败信息
// 游戏侧需提示用户当前支付流程失败了,并返回到当前档位的充值界面,让用户能够重新发起当前档位充值
}
- (void)onPaymentCancel:(NSNotification *)notif
{
[self textViewLog:@"取消支付"];
// 取消支付
// 游戏侧需提示用户取消了当前的支付流程,并返回到当前档位的充值界面,让用户能够重新发起当前档位充值
}
参数说明
【入参】
OrderInfo:
参数名称 | 类型 | 说明 | 备注 |
---|---|---|---|
amount | String | 价格,单位:元 | 必传 |
orderNo | String | CP 订单号,与[服务端接入文档-支付回调]中的"orderNo"对应,100 字符内,不能为空,如没有可以传入当前时间戳 | 必传 |
productId | String | 商品 Id | 必传 |
productName | String | 游戏道具名称,如元宝/月卡/钻石等 | 必传 |
productCount | long | 商品数量 | 必传 |
roleInfo | RoleInfo | 角色信息,见下表中的RoleInfo | 必传 |
sign | String | 支付验签参数,具体规则请查看服务端接入文档-下单签名 | 必传 |
extend | String | 自定义扩展字段(透传),与[服务端接入文档-支付回调]中的"extend"对应,1000 字符内,不能为空,如没有可以传入当前时间戳 | 必传 |
currency | String | 货币代号,如: USD | 可选 |
taskNum | int | 微信小游戏支付策略条件之一 | 可选 |
extstr | String | 手 Q 的必传参数 | 可选 |
RoleInfo info
参数名称 | 类型 | 说明 | 必传/可选 |
---|---|---|---|
roleInfo | RoleInfo | 角色上报-roleInfo | 必传 |
错误码
错误码 | 说明 |
---|---|
-100000 | 网络不可用,请检查网络 |
-100022 | 请先初始化成功后再调支付 |
FAQ
Q: SDK 下单时,订单校验失败
A: 请检查下单参数是否正确,如金额是否为整数,是否为正确的货币单位等。
- 常见情况是金额不一致导致的,请先确认游戏服务端生成 sign 的金额单位用的是分,调用 SDK 支付接口的金额单位是元。
- 注意客户端和服务端的区服需要保持一致(常见:合服后,前后端区服不同)
- 若金额一致情况下,但还是验证不过,请使用在线验签工具自行查验一遍,如下图
- 支付验签使用的是 appKey 而非 signKey