通过AnySDKIAP设置支付的回调函数,例如我这里的IAPExternalCall
AnySDKIAP.getInstance () .setListener (this,"IAPExternalCall");
客户端设置好支付回调函数,然后通过调用
AnySDKIAP.getInstance().payForProduct(products);
来发起支付请求(需要传入一个product的数据字典,需要的参数在anysdk文档中有写)。 待支付成功后,客户端会调支付成功的分支,并且此时可以通过
AnySDKIAP.getInstance().getOrderId();
获取到anysdk生成的订单号。
public void IAPExternalCall(string msg)
{
Debug.Log("IAPExternalCall(" + msg + ")");
Dictionary<string, string> dic = AnySDKUtil.stringToDictionary(msg);
int code = Convert.ToInt32(dic["code"]);
string result = dic["msg"];
switch (code)
{
case (int)PayResultCode.kPaySuccess://支付成功回调
Debug.Log("支付成功回调");
Debug.Log("支付result:" + result);
onPaySuccess();
break;
case (int)PayResultCode.kPayFail://支付失败回调
Debug.Log("支付失败回调");
onPayFail();
break;
case (int)PayResultCode.kPayCancel://支付取消回调
Debug.Log("支付取消回调");
onPayCancel();
break;
case (int)PayResultCode.kPayNetworkError://支付超时回调
onPayNetworkError();
break;
case (int)PayResultCode.kPayProductionInforIncomplete://支付信息不完整
onPayInfoIncomplete();
break;
/**
* 新增加:正在进行中回调
* 支付过程中若SDK没有回调结果,就认为支付正在进行中
* 游戏开发商可让玩家去判断是否需要等待,若不等待则进行下一次的支付
*/
case (int)PayResultCode.kPayNowPaying:
break;
default:
break;
}
}
同时anySDK服务器会异步通知在anysdk打包工具里配置的支付回调地址
在支付回调处理里其实主要需要做的就是对订单进行验证
将anySDK传给支付回调的参数进行排序,在进行md5签名来验证,具体的做法在anysdk服务端接入的例子里有。这里不再详细描述,但注意在验证签名成功后记得回传ok或者OK给anysdk服务端,因为如果anysdk服务端没有收到ok的回复的话,它会间隔一小段时间再次发送请求给支付回调地址,这样就会浪费资源,增加服务器压力。
response.setContentType( "text/plain;charset=utf-8");
try{
PrintWriter writer = response.getWriter();
System.out.println("ok");
writer.write( "ok" );
writer.flush();
} catch( Exception e ) {
e.printStackTrace();
}
比如我上面的在验证签名成功后回传给anysdk的处理,由于我本人用的是java做的web服务所以这里以java代码为例。
其实本身验证签名成功以后游戏服务器就可以发放相应的充值结果给客户端了,不过由于我们的支付验证服务器和游戏服务器是分开的,所以我中间还做了一步由支付验证服务器通知游戏服务器的过程。
以上就是支付接入的流程。