支付

业务场景

游戏内购买商品、月卡等游戏资源的时候需要调用本支付接口。用户支付成功后,由 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:

参数名称类型说明
备注
amountString价格,单位:元必传
orderNoStringCP 订单号,与[服务端接入文档-支付回调]中的"orderNo"对应,100 字符内,不能为空,如没有可以传入当前时间戳必传
productIdString商品 Id必传
productNameString游戏道具名称,如元宝/月卡/钻石等必传
productCountlong商品数量必传
roleInfoRoleInfo角色信息,见下表中的RoleInfo必传
signString支付验签参数,具体规则请查看服务端接入文档-下单签名必传
extendString自定义扩展字段(透传),与[服务端接入文档-支付回调]中的"extend"对应,1000 字符内,不能为空,如没有可以传入当前时间戳必传
currencyString货币代号,如: USD可选
taskNumint微信小游戏支付策略条件之一可选
extstrString手 Q 的必传参数可选

RoleInfo info

参数名称类型说明必传/可选
roleInfoRoleInfo角色上报-roleInfo必传

错误码

错误码说明
-100000网络不可用,请检查网络
-100022请先初始化成功后再调支付

FAQ

Q: SDK 下单时,订单校验失败

A: 请检查下单参数是否正确,如金额是否为整数,是否为正确的货币单位等。 image.png

  • 常见情况是金额不一致导致的,请先确认游戏服务端生成 sign 的金额单位用的是,调用 SDK 支付接口的金额单位是
  • 注意客户端和服务端的区服需要保持一致(常见:合服后,前后端区服不同)
  • 若金额一致情况下,但还是验证不过,请使用在线验签工具自行查验一遍,如下图

image.png

  • 支付验签使用的是 appKey 而非 signKey