今天给大家来一个比较简单的韩国本土支付,难度一般般吧,主要是没有任何的中文文档啊,全英文啊,我英文又特别渣啊,结果我又让运营搞个简单的翻译过来,为什么写这个呢,就是因为支付流程曲折,没有任何官方中文文档,出了这个,让负责海外的小伙伴能够快速接入,完成工作,方便撸啊,王者农药啊。对了,有游戏开发的大牛记得加我们哦 ,群197309807 ,不多辣啦,我们开始!
首先你运营给你一个文件 Onestore_iap_plugin.zip 你解压出来就是了,或者去onestore的官网去下载。接入代码和流程大致如下:
/*
这里只是一个成员变量的区分
*/
public void SetPayStae( int intSate)
{
mPayStae = intSate;
}
/* 全局变量解析 */ IapPlugin mPlugin; // 支付实例对象 final String OneStoreID = "你的支付ID"; // 支付的商品ID String PayProductId = ""; // 保存从后台取得的支付数据数组 JSONArray mPayJSONArray= new JSONArray(); //保存当前的支付数据 json JSONObject mPayJson = new JSONObject(); // 支付的状态 int mPayStae = 0; // 正常 // 成功code final String successCode = "0000"; // 当前是什么模式 正式或者调试 boolean mGameStae = true;
// 初始化onestore支付 public void InitIapPlugin() { if (mGameStae) { // 正式环境 mPlugin = IapPlugin.getPlugin(mActivity, IapPlugin.RELEASE_MODE); } else { // 测试用 mPlugin = IapPlugin.getPlugin(mActivity, IapPlugin.DEVELOPMENT_MODE); } getIapPluginInfo(); }
// 获取商品信息
/*
这里呢有一个回调,我把好几个回调都搞到这里了,用了一个状态区分
*/
public void getIapPluginInfo()
{
SetPayStae(1);
mPlugin.sendCommandProductInfo(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "你的OneStoreID");
};
/*
这里只是一个成员变量的区分
*/
public void SetPayStae( int intSate)
{
mPayStae = intSate;
}
/*
这里是一个全局的回调(包括保存商品ID 检查是商品否可以购买 查询支付明细等)
*/
private IapPlugin.AbsRequestCallback mAbsRequestCallback = new IapPlugin.AbsRequestCallback()
{
@Override
protected void onResponse(Response response)
{
if( mPayStae == 1 )
{
SaveIapPluginPayInLoal(response);
}
else if(mPayStae == 2)
{
SendPurchaseHistorlogic(response);
}
else if(mPayStae == 3)
{
SendPurchasabilitlogic( response );
}
mPayStae = -1;
}
@Override
public void onError(String reqid, String errcode, String errmsg)
{
// error
mPayStae = -1;
Log.d(TAG,"errcode====="+errcode);
Log.d(TAG,"errmsg====="+errmsg);
}
};
// 查询支付明细
public void SendPurchaseHistor(String pId)
{
SetPayStae(2);
// 查询支付明细
mPlugin.sendCommandPurchaseHistory(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, OneStoreID, pId);
};
/*
* 检查是否可以购买 逻辑
* */
public void SendPurchasabilitlogic( Response response )
{
if (successCode.equals(response.result.code))
{
if (response.result.product != null && response.result.product.size() > 0)
{
Response.Product p = response.result.product.get(0);
if(p.purchasability)
{
// 你可以购买这个商品
IapPluginPay(PayProductId,strextra);
return;
}
}
}
IapPluginPay(PayProductId,strextra);
}
/**
* 检查是否可以购买
* 可单一查询,多重查询
*/
public void SendPurchasabilit(String pId)
{
SetPayStae(3);
mPlugin.sendCommandCheckPurchasability(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, OneStoreID, pId);
};
// 保存商品ID在本地 jSON格式
public void SaveIapPluginPayInLoal( Response response )
{
for (Response.Product p : response.result.product)
{
JSONObject json = new JSONObject();
try {
json.put("id",p.id);
json.put("price",p.price);
json.put("type",p.type);
json.put("validity",p.validity); // 合法性质
json.put("id",p.id);
json.put("name",p.name);
} catch (JSONException e) {
e.printStackTrace();
}
mPayJSONArray.put(json);
}
}
/*
下面是一个支付回调 全局的
还有一个自己封装的支付函数
*/
// 支付回掉
private IapPlugin.AbsRequestCallback mAbsPayCallback = new IapPlugin.AbsRequestCallback()
{
@Override
protected void onResponse(Response response)
{
// 成功code
final String successCode = "0000";
// 成功确认
if (successCode.equals(response.result.code))
{
SendPurchaseHistor(PayProductId);
}
}
@Override
public void onError(String reqid, String errcode, String errmsg)
{
show_Text("Payment failed");
Log.d(TAG,"errcode====="+errcode);
Log.d(TAG,"errmsg====="+errmsg);
}
};
// 支付函数
public void IapPluginPay(String pid,String token)
{
PaymentParams params = new PaymentParams.Builder(OneStoreID, pid).build();
try {
String name = mPayJson.getString("name");
mPlugin.sendPaymentRequest(OneStoreID,pid,name,token,"",mAbsPayCallback);
} catch (JSONException e) {
e.printStackTrace();
}
}
/*
最后呢是一个支付成功的查询
*/
// 查询支付明细 逻辑
public void SendPurchaseHistorlogic( Response response )
{
// 结果中存在多个商品,获取想要的商品
for (Response.Product p : response.result.product)
{
int a = 0;
final String successStatusCode = "PH00";
if (successStatusCode.equals(p.status.code))
{
// Product p中获取想要的信息
// check 商品认证成功
// 支付成功
JSONObject json = new JSONObject();
try {
json.put("date",p.startDate);
json.put("token",strextra);
}catch (JSONException e) {
e.printStackTrace();
}
支付成功后的逻辑 之后就看你咯
}
else
{
// 支付失败 也看你咯
}
}
}
/*
自己封装的支付函数
你传入一个商品ID 看看json缓存里面有木有 有就开始支付
*/
@Override
public void Pay(String pid, String extra, final int cb)
{
String product_id = pid;
int PayLen = mPayJSONArray.length();
if (PayLen <= 0)
{
show_Text("没有获取到商品ID");
Log.d(TAG,"没有获取到商品ID");
return;
}
for (int i = 0; i < PayLen ; i++) {
try {
JSONObject json = (JSONObject) mPayJSONArray.get(i);
String TId = json.getString("id");
if(product_id.equals(TId))
{
PayProductId = TId;
mPayJson = json;
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
SendPurchasabilit(PayProductId);
}
============支付流程解析======
游戏一启动你要调用 InitIapPlugin() 初始化支付SDK 里面有个 getIapPluginInfo()函数负责去后台得到你配置的支付数据 最后 SaveIapPluginPayInLoal()函数保存数据在josn数据 游戏初始化成功。
然后是调用 pay()函数的时候找对应的商品ID,就会调用 SendPurchasabilit()函数 看看是否可以购买,如果可以购买就直接 走这里 SendPurchasabilitlogic()会调用IapPluginPay 触发SDKsendPaymentRequest()支付函数,mAbsPayCallback()就会收到你支付的回调了,注意,这里还没有完成,还有走SendPurchaseHistor()查询你当前的支付明细状态,SendPurchaseHistorlogic()这个就是啦,如果你的支付状态等于"PH00"才算真正的充值成功。艾玛这剧情真的蜿蜒曲折,绵绵悠长。当然主要还是你们接入成功才算成功!
我是大嫂!