今天跟大家一起看看UC支付,UC支付與其他支付不同之處在于:UC支付結(jié)果是發(fā)送到游戲服務(wù)器端的,所以我們在完成支付后需要詢問服務(wù)器端支付是否成功,當(dāng)確定支付成功后再執(zhí)行相應(yīng)的邏輯。
UC接入需要注意的事項比較多:
1.UC需要修改桌面游戲Logo,在游戲圖標(biāo)基礎(chǔ)上加上UC的“9”圖標(biāo),規(guī)范及樣例會在百度網(wǎng)盤中為大家共享。
2.需要引入91SDK_LibProject工程作為Library。
3.搭建服務(wù)器用來接收UC返回來的支付結(jié)果(服務(wù)器端接入文檔及demo會在網(wǎng)盤中跟大家共享,我這里沒有搭建服務(wù)器端環(huán)境,無法給大家演示)。
4.支付數(shù)據(jù)存到本地,以便標(biāo)識是否支付成功。
網(wǎng)盤地址:http://pan.baidu.com/share/link?shareid=438930&uk=473193131
這里跟大家一起看下如何將一個工程作為Library及供其它工程引用:
1.將91SDK_LibProject作為一個正常工程引入
2.然后我們看到這里果斷打著個紅嘆號,這意味著有工程文件缺失,右擊項目->Properties->JavaBuild Path ->Source,看到這里src ismissing此工程用不到Java代碼所以這個直接刪掉就行,然后Clean項目。
圖 1-1
3.紅嘆號沒有了,然后在圖1-1界面選擇左側(cè)邊欄的Android,勾選Is Library確定
3.右擊需要引入次工程的工程(即需要接入付費SDK的工程),選擇properties,選Add將剛才作為Library的工程
引入進(jìn)來
4.當(dāng)你看到AndroidDependencies下有了引入的工程那么工程作為Library引入完畢,如果沒有的話刷新一下Clean一下,如果還沒有那么說明引入過程有問題,重新來一遍
下邊來看下代碼:
AndroidManifest.xml:
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.blogforuc.uc" 此處要加上.uc的標(biāo)識
- android:versionCode="1"
- android:versionName="1.0" >
- <!-- UC-->
- <serviceandroid:nameserviceandroid:name="com.catcap.MyService"></service>
-
- <activity
- android:name="ucgamesdk.example.ApiGameDataActivity"
- android:configChanges="keyboardHidden|orientation"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.Translucent"
- android:windowSoftInputMode="adjustResize" >
- </activity>
-
- <activity
- android:name="cn.uc.gamesdk.view.SdkWebActivity"
- android:configChanges="keyboardHidden|orientation"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.Translucent"
- android:windowSoftInputMode="adjustResize" >
- </activity>
-
- <meta-data android:value="cn"android:name="APP_LANGUAGE"/>
- <meta-data android:value="channel1"android:name="UMOB_CHID"/>
- <meta-data android:value="XXXX"android:name="UMOB_APPKEY"/>//此處填寫自己申請的
-
- <!-- UC廣告-->
- <activityandroid:nameactivityandroid:name="cn.umob.android.ad.UMOBActivity"android:theme="@android:style/Theme.Translucent">
- </activity>
- <!-- UC -->
Fiap.java:支付接口初始化及支付
- package com.example.blogforuc.uc;
- import cn.uc.gamesdk.UCCallbackListener;
- import cn.uc.gamesdk.UCCallbackListenerNullException;
- import cn.uc.gamesdk.UCGameSDK;
- import cn.uc.gamesdk.UCGameSDKStatusCode;
- import cn.uc.gamesdk.UCLogLevel;
- import cn.uc.gamesdk.info.GameParamInfo;
- import cn.uc.gamesdk.info.OrderInfo;
- import cn.uc.gamesdk.info.PaymentInfo;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.Dialog;
- import android.app.ProgressDialog;
- import android.content.ContentValues;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.database.sqlite.SQLiteDatabase;
- import android.net.ConnectivityManager;
- import android.net.NetworkInfo;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.view.View;
- public class Fiap extends Activity {
- // ===================================
- // JAVA
- // ===================================
- // 以下參數(shù)僅供測試。在正式集成SDK時,需要使用正式的id數(shù)據(jù)。
- // 游戲開發(fā)人員需要跟自己的商務(wù)或運(yùn)營人員聯(lián)系獲取。
- public int cpId = 3;
- public int gameId = 3;
- public int serverId = 5;
- private int catcapcoin;
- // 調(diào)試模式,此處聯(lián)調(diào)模式時需要置為true
- public boolean debugMode = false;
- private MyDBHelper helper;
- private SQLiteDatabase db;
- private Intent intent;
- private Dialog dialog;
- private MyHandler handler;
-
- @Override
- protected void onCreate(BundlesavedInstanceState) {
- // TODO Auto-generated methodstub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- intent = new Intent(Fiap.this,MyService.class);
- this.startService(intent);
- handler = newMyHandler();
- findViewById(R.id.button1).setOnClickListener(
- newView.OnClickListener() {
- @Override
- publicvoid onClick(View v) {
- //TODO Auto-generated method stub
- android_pay(0);
- }
- });
- }
- public void android_pay(int catcap_coin) {
- switch (catcap_coin) {
- case 0:
- catcapcoin =2;
- break;
- case 1:
- catcapcoin =4;
- break;
- case 2:
- catcapcoin =6;
- break;
- case 3:
- catcapcoin =8;
- break;
- case 4:
- catcapcoin =10;
- break;
- case 5:
- catcapcoin =12;
- break;
- case 6:
- catcapcoin =14;
- break;
- }
- ucNetworkAndInitUCGameSDK();
- }
- public void ucNetworkAndInitUCGameSDK(){
- // !!!在調(diào)用SDK初始化前進(jìn)行網(wǎng)絡(luò)檢查
- // 當(dāng)前沒有擁有網(wǎng)絡(luò)
- if (false ==isNetworkAvailable(this)) {
- Message msg =new Message();
- Bundle bundle= new Bundle();
- bundle.putInt("what",3);
- msg.setData(bundle);
- handler.sendMessage(msg);
- } else {
- ucSdkInit();// 執(zhí)行UCGameSDK初始化
- }
- }
- public static booleanisNetworkAvailable(Context context) {
- ConnectivityManager cm =(ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo info =cm.getActiveNetworkInfo();
- if (info != null&& info.getState() ==NetworkInfo.State.CONNECTED)
- returntrue;
- return false;
- }
- private void ucSdkInit() {
- Message msg = newMessage();
- Bundle bundle = newBundle();
- bundle.putInt("what", 0);
- msg.setData(bundle);
- handler.sendMessage(msg);
- try {
- GameParamInfogpi = new GameParamInfo();
- gpi.setCpId(cpId);
- gpi.setGameId(gameId);
- gpi.setServerId(serverId);
- UCGameSDK.defaultSDK().initSDK(getApplicationContext(),
- UCLogLevel.DEBUG,debugMode, gpi,
- newUCCallbackListener<String>() {
- @Override
- publicvoid callback(int code, String msg) {
- Messagemsg2 = new Message();
- Bundlebundle = new Bundle();
- bundle.putInt("what",1);
- msg2.setData(bundle);
- handler.sendMessage(msg2);
- Log.e("UCGameSDK","UCGameSDK初始化接口返回數(shù)據(jù) msg:" + msg
- +",code:" + code + ",debug:" + debugMode
- +"\n");
- switch(code) {
- //初始化成功,調(diào)用登錄
- caseUCGameSDKStatusCode.SUCCESS:
- //調(diào)用sdk登錄接口
- ucSdkLogin();
- break;
- //初始化失敗
- caseUCGameSDKStatusCode.INIT_FAIL:
- ucNetworkAndInitUCGameSDK();
- default:
- break;
- }
- }
- });
- } catch(UCCallbackListenerNullException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void ucSdkLogin() {
- try {
- //登錄接口回調(diào)。從這里可以獲取登錄結(jié)果。
- UCCallbackListener<String>loginCallbackListener = newUCCallbackListener<String>() {
- @Override
- publicvoid callback(int code, String msg) {
- Messagemsg2 = new Message();
- Bundlebundle = new Bundle();
- bundle.putInt("what",1);
- msg2.setData(bundle);
- handler.sendMessage(msg2);
- Log.e("UCGameSDK","UCGameSdk登錄接口返回數(shù)據(jù):code=" + code
- +",msg=" + msg);
- //登錄成功。此時可以獲取sid。并使用sid進(jìn)行游戲的登錄邏輯。
- if(code == UCGameSDKStatusCode.SUCCESS) {
- System.out.println("UCGameSDKSUCCESS");
- payMoney();
- }
- //登錄失敗。應(yīng)該先執(zhí)行初始化成功后再進(jìn)行登錄調(diào)用。
- if(code == UCGameSDKStatusCode.NO_INIT) {
- System.out.println("UCGameSDKNO_INIT");
- }
- //登錄退出。該回調(diào)會在登錄界面退出時執(zhí)行。
- if(code == UCGameSDKStatusCode.LOGIN_EXIT) {
- System.out.println("UCGameSDKLOGIN_EXIT");
- }
- }
- };
- Message msg =new Message();
- Bundle bundle= new Bundle();
- bundle.putInt("what",0);
- msg.setData(bundle);
- handler.sendMessage(msg);
- UCGameSDK.defaultSDK().login(Fiap.this,loginCallbackListener);
- } catch(UCCallbackListenerNullException e) {
- e.printStackTrace();
- }
- }
- private void payMoney() {
-
- PaymentInfo paymentInfo = newPaymentInfo();
- paymentInfo.setRoleId(""); //用戶角色id
- paymentInfo.setRoleName(""); //角色名字
- paymentInfo.setGrade(""); //角色等級
- paymentInfo.setCustomInfo("");// 游戲自定義信息
- // 服務(wù)器分區(qū)id
- paymentInfo.setServerId(0);
- // 通過設(shè)置參數(shù)會有以下效果:
- // 當(dāng)amount <=0.0時,正常支付
- // 當(dāng)amount >0.0時,使用定額支付
- paymentInfo.setAmount(catcapcoin);
- //是否允許連續(xù)充值,這個在SDK2.1.0后不起作用
- paymentInfo.setAllowContinuousPay(false);
- try {
- UCGameSDK.defaultSDK().pay(Fiap.this,paymentInfo,
- newUCCallbackListener<OrderInfo>(){
- @Override
- publicvoid callback(int statudcode, OrderInfo orderInfo) {
-
- Stringtexts = "";
- switch(statudcode) {
- caseUCGameSDKStatusCode.SUCCESS:
- helper= new MyDBHelper(Fiap.this,
- "orderinfo.db",null, 1);
- db= helper.getWritableDatabase();
- ContentValuesvalues = new ContentValues();
- values.put("orderid",orderInfo.getOrderId());
- values.put("flag","paying");
- db.insert("orderinfo",null, values);
- helper.close();
- db.close();
- break;
- caseUCGameSDKStatusCode.NO_INIT:
- texts+= "UCGameSDK調(diào)用支付接口失敗,未初始化" + "\n";
- Log.e("UCGameSDK",texts);
- break;
- caseUCGameSDKStatusCode.PAY_USER_EXIT:
- texts+= "UCGameSDK支付界面退出" + "\n";
- Log.e("UCGameSDK",texts);
- break;
- default:
- break;
- }
- }
- });
- } catch (Exception e) {
- Log.e("UCGameSDK","UCGameSDK支付接口調(diào)用異常", e);
- }
- }
- class MyHandler extends Handler {
- @Override
- public voidhandleMessage(Message msg) {
- // TODOAuto-generated method stub
- super.handleMessage(msg);
- Bundle b =msg.getData();
- int what =b.getInt("what");
- switch (what){
- case 0:
- dialog= ProgressDialog.show(Fiap.this, "", "請稍后,正在加載");
- dialog.setCancelable(false);
- break;
- case 1:
- dialog.cancel();
- break;
- case 3:
- AlertDialog.Builderab = new AlertDialog.Builder(Fiap.this);
- ab.setMessage("網(wǎng)絡(luò)未連接,請設(shè)置網(wǎng)絡(luò)");
- ab.setPositiveButton("設(shè)置",
- newDialogInterface.OnClickListener() {
- @Override
- publicvoid onClick(DialogInterface dialog,
- intwhich) {
- Intentintent = new Intent(
- "android.settings.SETTINGS");
- startActivityForResult(intent,0);
- }
- });
- ab.setNegativeButton("退出",
- newDialogInterface.OnClickListener() {
- @Override
- publicvoid onClick(DialogInterface dialog,
- intwhich) {
- }
- });
- ab.show();
- break;
- }
- }
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated methodstub
- super.onDestroy();
- this.stopService(intent);
- }
- }
MyService.java:查詢訂單是否支付成功并完成支付成功的后續(xù)邏輯
- package com.example.blogforuc.uc;
-
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.util.EntityUtils;
- import org.json.JSONObject;
- import android.app.Service;
- import android.content.ContentValues;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.os.IBinder;
- import android.util.Log;
-
-
-
- public class MyService extends Service{
-
- private String m_amount = "";
- private MyDBHelper helper;
- private SQLiteDatabase db;
- //是否終止線程的標(biāo)志,當(dāng)程序執(zhí)行OnDestory的時候需要置為false
- private boolean flag;
- //此處填寫查詢訂單是否支付成功的服務(wù)器地址
- private String url = "";
-
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
-
- return null;
- }
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- }
- @Override
- public void onStart(Intent intent, int startId) {
- // TODO Auto-generated method stub
- super.onStart(intent, startId);
- flag = true;
-
- Thread th = new Thread(new myThread());
- th.start();
- }
-
- class myThread implements Runnable{
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while(flag){
- helper = new MyDBHelper(getApplicationContext(), "orderinfo.db", null, 1);
- db = helper.getWritableDatabase();
- //查詢出未支付成功的訂單
- Cursor cursor = db.query("orderinfo", null, "flag = ?", new String[]{"paying"}, null, null, null);
- if (null!=cursor) {
- while(cursor.moveToNext()){
- String id_order = cursor.getString(1);
- if (null!=id_order) {
- if (isSuccess(id_order)) {
-
- if (null!=m_amount) {
-
- //這里填寫支付成功后的邏輯,并將數(shù)據(jù)庫里的對應(yīng)記錄置為payed
-
- // Layer.pay(catcapcoin);
- ContentValues values = new ContentValues();
- values.put("flag", "payed");
- db.update("orderinfo", values, "orderid = ?", new String[]{id_order});
- }
- }
- }
- }
- }
- helper.close();
- db.close();
- try {
- Thread.sleep(60000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- }
- }
- }
- //詢問服務(wù)器訂單是否支付成功
- private boolean isSuccess(String id_order){
- try {
- String str = id_order
- + "gGoXQmgHA42egR";//gGoXQmgHA42egR為secret可以自己設(shè)置也可不寫,主要是考慮數(shù)據(jù)安全性
- String md5_sign = MD5(str);
- HttpGet httpRequest = new HttpGet(url);
- String strResult = "";
- // HttpClient對象
- HttpClient httpClient = new DefaultHttpClient();
- // 獲得HttpResponse對象
- HttpResponse httpResponse = httpClient
- .execute(httpRequest);
- if (httpResponse
- .getStatusLine()
- .getStatusCode() == HttpStatus.SC_OK) {
- // 取得返回的數(shù)據(jù)
- strResult = EntityUtils
- .toString(httpResponse
- .getEntity());
- }
- //構(gòu)造解析JSON數(shù)據(jù)對象
- JSONObject jsonObj = new JSONObject(strResult);
- //此處都是我項目中用到的參數(shù)在這里做個實例,請自行配置
- String m_status = jsonObj.getString("status");
- String m_sign = jsonObj.getString("sign");
- String m_orderId = jsonObj.getString("orderId");
- String m_ucid = jsonObj.getString("ucid");
- m_amount = jsonObj.getString("amount");
-
- Log.d("UCGameSDK","支付結(jié)果獲取"+ m_status);
-
- String str_get = m_orderId+m_ucid+m_amount+m_status+"gGoXQmgHA42egR";
- String str_md5 = MD5(str_get);
- if (m_status.equals("success")&&m_sign.equals(str_md5)) {
- //支付成功
- return true;
- }else {
- //支付失敗
- return false;
- }
- } catch (Exception e) {
- // TODO: handle exception
- return false;
- }
- }
-
- private String convertToHex(byte[] data) {
- StringBuffer buf = new StringBuffer();
- for (int i = 0; i < data.length; i++) {
- int halfbyte = (data[i] >>> 4) & 0x0F;
- int two_halfs = 0;
- do {
- if ((0 <= halfbyte) && (halfbyte <= 9))
- buf.append((char) ('0' + halfbyte));
- else
- buf.append((char) ('a' + (halfbyte - 10)));
- halfbyte = data[i] & 0x0F;
- } while(two_halfs++ < 1);
- }
- return buf.toString();
- }
- //MD5校驗
- public String MD5(String text)
- throws NoSuchAlgorithmException, Exception {
- MessageDigest md;
- md = MessageDigest.getInstance("MD5");
- byte[] md5hash = new byte[32];
- md.update(text.getBytes("iso-8859-1"), 0, text.length());
- md5hash = md.digest();
- return convertToHex(md5hash);
- }
-
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- flag = false;
- }
-
- @Override
- public void unbindService(ServiceConnection conn) {
- // TODO Auto-generated method stub
- super.unbindService(conn);
-
- }
- }
MyDBHelper.java:數(shù)據(jù)庫字段搭建
- package com.example.blogforuc.uc;
-
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteDatabase.CursorFactory;
- import android.database.sqlite.SQLiteOpenHelper;
-
- public class MyDBHelper extends SQLiteOpenHelper{
-
- private String sql_create = "create table orderinfo"+"(_id integer primary key autoincrement,orderid,flag)";
-
- public MyDBHelper(Context context, String name, CursorFactory factory,
- int version) {
- super(context, name, factory, version);
- // TODO Auto-generated constructor stub
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- // TODO Auto-generated method stub
- db.execSQL(sql_create);
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // TODO Auto-generated method stub
-
- }
-
- }
下邊即支付界面: