分享

Android支付接入(六):UC支付

 kiki的号 2017-04-12

  今天跟大家一起看看UC支付,UC支付与其他支付不同之处在于:UC支付结果是发送到游戏服务器端的,所以我们在完成支付后需要询问服务器端支付是否成功,当确定支付成功后再执行相应的逻辑。

   UC接入需要注意的事项比较多:

1.UC需要修改桌面游戏Logo,在游戏图标基础上加上UC的“9”图标,规范及样例会在百度网盘中为大家共享。

2.需要引入91SDK_LibProject工程作为Library。

3.搭建服务器用来接收UC返回来的支付结果(服务器端接入文档及demo会在网盘中跟大家共享,我这里没有搭建服务器端环境,无法给大家演示)。

4.支付数据存到本地,以便标识是否支付成功。

 

网盘地址: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界面选择左侧边栏的Android,勾选Is Library确定


3.右击需要引入次工程的工程(即需要接入付费SDK的工程),选择properties,选Add将刚才作为Library的工程

引入进来


Android支付接入(六):UC支付
4.当你看到AndroidDependencies下有了引入的工程那么工程作为Library引入完毕,如果没有的话刷新一下Clean一下,如果还没有那么说明引入过程有问题,重新来一遍

 

下边来看下代码:

 

AndroidManifest.xml:

 

  1. <manifest xmlns:android="http://schemas./apk/res/android"  
  2.    package="com.example.blogforuc.uc" 此处要加上.uc的标识  
  3.    android:versionCode="1"  
  4.    android:versionName="1.0" >  
  5.  <!-- UC-->  
  6.        <serviceandroid:nameserviceandroid:name="com.catcap.MyService"></service>  
  7.          
  8.        <activity  
  9.            android:name="ucgamesdk.example.ApiGameDataActivity"  
  10.            android:configChanges="keyboardHidden|orientation"  
  11.            android:label="@string/app_name"  
  12.            android:theme="@android:style/Theme.Translucent"  
  13.            android:windowSoftInputMode="adjustResize" >  
  14.        </activity>  
  15.          
  16.        <activity  
  17.            android:name="cn.uc.gamesdk.view.SdkWebActivity"  
  18.            android:configChanges="keyboardHidden|orientation"  
  19.            android:label="@string/app_name"  
  20.            android:theme="@android:style/Theme.Translucent"  
  21.            android:windowSoftInputMode="adjustResize" >  
  22.        </activity>  
  23.          
  24.        <meta-data android:value="cn"android:name="APP_LANGUAGE"/>  
  25.        <meta-data android:value="channel1"android:name="UMOB_CHID"/>  
  26.        <meta-data android:value="XXXX"android:name="UMOB_APPKEY"/>//此处填写自己申请的  
  27.          
  28.   <!-- UC广告-->  
  29.        <activityandroid:nameactivityandroid:name="cn.umob.android.ad.UMOBActivity"android:theme="@android:style/Theme.Translucent">  
  30.        </activity>  
  31.        <!-- UC -->  

Fiap.java:支付接口初始化及支付

 

  1. package com.example.blogforuc.uc;  
  2. import cn.uc.gamesdk.UCCallbackListener;  
  3. import cn.uc.gamesdk.UCCallbackListenerNullException;  
  4. import cn.uc.gamesdk.UCGameSDK;  
  5. import cn.uc.gamesdk.UCGameSDKStatusCode;  
  6. import cn.uc.gamesdk.UCLogLevel;  
  7. import cn.uc.gamesdk.info.GameParamInfo;  
  8. import cn.uc.gamesdk.info.OrderInfo;  
  9. import cn.uc.gamesdk.info.PaymentInfo;  
  10. import android.app.Activity;  
  11. import android.app.AlertDialog;  
  12. import android.app.Dialog;  
  13. import android.app.ProgressDialog;  
  14. import android.content.ContentValues;  
  15. import android.content.Context;  
  16. import android.content.DialogInterface;  
  17. import android.content.Intent;  
  18. import android.database.sqlite.SQLiteDatabase;  
  19. import android.net.ConnectivityManager;  
  20. import android.net.NetworkInfo;  
  21. import android.os.Bundle;  
  22. import android.os.Handler;  
  23. import android.os.Message;  
  24. import android.util.Log;  
  25. import android.view.View;  
  26. public class Fiap extends Activity {  
  27.  // ===================================  
  28.  // JAVA  
  29.  // ===================================  
  30.  // 以下参数仅供测试。在正式集成SDK时,需要使用正式的id数据。  
  31.  // 游戏开发人员需要跟自己的商务或运营人员联系获取。  
  32.  public int cpId = 3;  
  33.  public int gameId = 3;  
  34.  public int serverId = 5;  
  35.  private int catcapcoin;  
  36.  // 调试模式,此处联调模式时需要置为true  
  37.  public boolean debugMode = false;  
  38.  private MyDBHelper helper;  
  39.  private SQLiteDatabase db;  
  40.  private Intent intent;  
  41.  private Dialog dialog;  
  42.  private MyHandler handler;  
  43.    
  44.  @Override  
  45.  protected void onCreate(BundlesavedInstanceState) {  
  46.   // TODO Auto-generated methodstub  
  47.   super.onCreate(savedInstanceState);  
  48.   setContentView(R.layout.activity_main);  
  49.   intent = new Intent(Fiap.this,MyService.class);  
  50.   this.startService(intent);  
  51.   handler = newMyHandler();  
  52.   findViewById(R.id.button1).setOnClickListener(  
  53.     newView.OnClickListener() {  
  54.      @Override  
  55.      publicvoid onClick(View v) {  
  56.       //TODO Auto-generated method stub  
  57.       android_pay(0);  
  58.      }  
  59.     });  
  60.  }  
  61.  public void android_pay(int catcap_coin) {  
  62.   switch (catcap_coin) {  
  63.   case 0:  
  64.    catcapcoin =2;  
  65.    break;  
  66.   case 1:  
  67.    catcapcoin =4;  
  68.    break;  
  69.   case 2:  
  70.    catcapcoin =6;  
  71.    break;  
  72.   case 3:  
  73.    catcapcoin =8;  
  74.    break;  
  75.   case 4:  
  76.    catcapcoin =10;  
  77.    break;  
  78.   case 5:  
  79.    catcapcoin =12;  
  80.    break;  
  81.   case 6:  
  82.    catcapcoin =14;  
  83.    break;  
  84.   }  
  85.   ucNetworkAndInitUCGameSDK();  
  86.  }  
  87.  public void ucNetworkAndInitUCGameSDK(){  
  88.   // !!!在调用SDK初始化前进行网络检查  
  89.   // 当前没有拥有网络  
  90.   if (false ==isNetworkAvailable(this)) {  
  91.    Message msg =new Message();  
  92.    Bundle bundle= new Bundle();  
  93.    bundle.putInt("what",3);  
  94.    msg.setData(bundle);  
  95.    handler.sendMessage(msg);  
  96.   } else {  
  97.    ucSdkInit();// 执行UCGameSDK初始化  
  98.   }  
  99.  }  
  100.  public static booleanisNetworkAvailable(Context context) {  
  101.   ConnectivityManager cm =(ConnectivityManager) context  
  102.     .getSystemService(Context.CONNECTIVITY_SERVICE);  
  103.   NetworkInfo info =cm.getActiveNetworkInfo();  
  104.   if (info != null&& info.getState() ==NetworkInfo.State.CONNECTED)  
  105.    returntrue;  
  106.   return false;  
  107.  }  
  108.  private void ucSdkInit() {  
  109.   Message msg = newMessage();  
  110.   Bundle bundle = newBundle();  
  111.   bundle.putInt("what"0);  
  112.   msg.setData(bundle);  
  113.   handler.sendMessage(msg);  
  114.   try {  
  115.    GameParamInfogpi = new GameParamInfo();  
  116.    gpi.setCpId(cpId);  
  117.    gpi.setGameId(gameId);  
  118.    gpi.setServerId(serverId);  
  119.    UCGameSDK.defaultSDK().initSDK(getApplicationContext(),  
  120.      UCLogLevel.DEBUG,debugMode, gpi,  
  121.      newUCCallbackListener<String>() {  
  122.       @Override  
  123.       publicvoid callback(int code, String msg) {  
  124.        Messagemsg2 = new Message();  
  125.        Bundlebundle = new Bundle();  
  126.        bundle.putInt("what",1);  
  127.        msg2.setData(bundle);  
  128.        handler.sendMessage(msg2);  
  129.        Log.e("UCGameSDK","UCGameSDK初始化接口返回数据 msg:" + msg  
  130.          +",code:" + code + ",debug:" + debugMode  
  131.          +"\n");  
  132.        switch(code) {  
  133.        //初始化成功,调用登录  
  134.        caseUCGameSDKStatusCode.SUCCESS:  
  135.         //调用sdk登录接口  
  136.         ucSdkLogin();  
  137.         break;  
  138.        //初始化失败  
  139.        caseUCGameSDKStatusCode.INIT_FAIL:  
  140.         ucNetworkAndInitUCGameSDK();  
  141.        default:  
  142.         break;  
  143.        }  
  144.       }  
  145.      });  
  146.   } catch(UCCallbackListenerNullException e) {  
  147.    e.printStackTrace();  
  148.   } catch (Exception e) {  
  149.    e.printStackTrace();  
  150.   }  
  151.  }  
  152.  private void ucSdkLogin() {  
  153.   try {  
  154.    //登录接口回调。从这里可以获取登录结果。  
  155.    UCCallbackListener<String>loginCallbackListener = newUCCallbackListener<String>() {  
  156.     @Override  
  157.     publicvoid callback(int code, String msg) {  
  158.      Messagemsg2 = new Message();  
  159.      Bundlebundle = new Bundle();  
  160.      bundle.putInt("what",1);  
  161.      msg2.setData(bundle);  
  162.      handler.sendMessage(msg2);  
  163.      Log.e("UCGameSDK","UCGameSdk登录接口返回数据:code=" + code  
  164.        +",msg=" + msg);  
  165.      //登录成功。此时可以获取sid。并使用sid进行游戏的登录逻辑。  
  166.      if(code == UCGameSDKStatusCode.SUCCESS) {  
  167.       System.out.println("UCGameSDKSUCCESS");  
  168.       payMoney();  
  169.      }  
  170.      //登录失败。应该先执行初始化成功后再进行登录调用。  
  171.      if(code == UCGameSDKStatusCode.NO_INIT) {  
  172.       System.out.println("UCGameSDKNO_INIT");  
  173.      }  
  174.      //登录退出。该回调会在登录界面退出时执行。  
  175.      if(code == UCGameSDKStatusCode.LOGIN_EXIT) {  
  176.       System.out.println("UCGameSDKLOGIN_EXIT");  
  177.      }  
  178.     }  
  179.    };  
  180.    Message msg =new Message();  
  181.    Bundle bundle= new Bundle();  
  182.    bundle.putInt("what",0);  
  183.    msg.setData(bundle);  
  184.    handler.sendMessage(msg);  
  185.    UCGameSDK.defaultSDK().login(Fiap.this,loginCallbackListener);  
  186.   } catch(UCCallbackListenerNullException e) {  
  187.    e.printStackTrace();  
  188.   }  
  189.  }  
  190.  private void payMoney() {  
  191.     
  192.   PaymentInfo paymentInfo = newPaymentInfo();  
  193.   paymentInfo.setRoleId(""); //用户角色id  
  194.   paymentInfo.setRoleName(""); //角色名字  
  195.   paymentInfo.setGrade(""); //角色等级  
  196.   paymentInfo.setCustomInfo("");// 游戏自定义信息  
  197.   // 服务器分区id  
  198.   paymentInfo.setServerId(0);  
  199.   // 通过设置参数会有以下效果:  
  200.   // 当amount <=0.0时,正常支付  
  201.   // 当amount >0.0时,使用定额支付  
  202.   paymentInfo.setAmount(catcapcoin);  
  203.   //是否允许连续充值,这个在SDK2.1.0后不起作用  
  204.   paymentInfo.setAllowContinuousPay(false);  
  205.   try {  
  206.    UCGameSDK.defaultSDK().pay(Fiap.this,paymentInfo,  
  207.      newUCCallbackListener<OrderInfo>(){  
  208.       @Override  
  209.       publicvoid callback(int statudcode, OrderInfo orderInfo) {  
  210.          
  211.        Stringtexts = "";  
  212.        switch(statudcode) {  
  213.        caseUCGameSDKStatusCode.SUCCESS:  
  214.         helper= new MyDBHelper(Fiap.this,  
  215.           "orderinfo.db",null1);  
  216.         db= helper.getWritableDatabase();  
  217.         ContentValuesvalues = new ContentValues();  
  218.         values.put("orderid",orderInfo.getOrderId());  
  219.         values.put("flag","paying");  
  220.         db.insert("orderinfo",null, values);  
  221.         helper.close();  
  222.         db.close();  
  223.         break;  
  224.        caseUCGameSDKStatusCode.NO_INIT:  
  225.         texts+= "UCGameSDK调用支付接口失败,未初始化" + "\n";  
  226.         Log.e("UCGameSDK",texts);  
  227.         break;  
  228.        caseUCGameSDKStatusCode.PAY_USER_EXIT:  
  229.         texts+= "UCGameSDK支付界面退出" + "\n";  
  230.         Log.e("UCGameSDK",texts);  
  231.         break;  
  232.        default:  
  233.         break;  
  234.        }  
  235.       }  
  236.      });  
  237.   } catch (Exception e) {  
  238.    Log.e("UCGameSDK","UCGameSDK支付接口调用异常", e);  
  239.   }  
  240.  }  
  241.  class MyHandler extends Handler {  
  242.   @Override  
  243.   public voidhandleMessage(Message msg) {  
  244.    // TODOAuto-generated method stub  
  245.    super.handleMessage(msg);  
  246.    Bundle b =msg.getData();  
  247.    int what =b.getInt("what");  
  248.    switch (what){  
  249.    case 0:  
  250.     dialog= ProgressDialog.show(Fiap.this"""请稍后,正在加载");  
  251.     dialog.setCancelable(false);  
  252.     break;  
  253.    case 1:  
  254.     dialog.cancel();  
  255.     break;  
  256.    case 3:  
  257.     AlertDialog.Builderab = new AlertDialog.Builder(Fiap.this);  
  258.     ab.setMessage("网络未连接,请设置网络");  
  259.     ab.setPositiveButton("设置",  
  260.       newDialogInterface.OnClickListener() {  
  261.        @Override  
  262.        publicvoid onClick(DialogInterface dialog,  
  263.          intwhich) {  
  264.         Intentintent = new Intent(  
  265.           "android.settings.SETTINGS");  
  266.         startActivityForResult(intent,0);  
  267.        }  
  268.       });  
  269.     ab.setNegativeButton("退出",  
  270.       newDialogInterface.OnClickListener() {  
  271.        @Override  
  272.        publicvoid onClick(DialogInterface dialog,  
  273.          intwhich) {  
  274.        }  
  275.       });  
  276.     ab.show();  
  277.     break;  
  278.    }  
  279.   }  
  280.  }  
  281.  @Override  
  282.  protected void onDestroy() {  
  283.   // TODO Auto-generated methodstub  
  284.   super.onDestroy();  
  285.   this.stopService(intent);  
  286.  }  
  287. }  

MyService.java:查询订单是否支付成功并完成支付成功的后续逻辑

  1. package com.example.blogforuc.uc;  
  2.   
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5. import org.apache.http.HttpResponse;  
  6. import org.apache.http.HttpStatus;  
  7. import org.apache.http.client.HttpClient;  
  8. import org.apache.http.client.methods.HttpGet;  
  9. import org.apache.http.impl.client.DefaultHttpClient;  
  10. import org.apache.http.util.EntityUtils;  
  11. import org.json.JSONObject;  
  12. import android.app.Service;  
  13. import android.content.ContentValues;  
  14. import android.content.Intent;  
  15. import android.content.ServiceConnection;  
  16. import android.database.Cursor;  
  17. import android.database.sqlite.SQLiteDatabase;  
  18. import android.os.IBinder;  
  19. import android.util.Log;  
  20.   
  21.    
  22.   
  23. public class MyService extends Service{  
  24.    
  25.  private String m_amount = "";  
  26.  private MyDBHelper helper;  
  27.  private SQLiteDatabase db;  
  28.  //是否终止线程的标志,当程序执行OnDestory的时候需要置为false  
  29.  private boolean flag;  
  30.  //此处填写查询订单是否支付成功的服务器地址  
  31.  private String url = "";  
  32.    
  33.  @Override  
  34.  public IBinder onBind(Intent intent) {  
  35.   // TODO Auto-generated method stub  
  36.     
  37.   return null;  
  38.  }  
  39.  @Override  
  40.  public void onCreate() {  
  41.   // TODO Auto-generated method stub  
  42.   super.onCreate();  
  43.  }  
  44.  @Override  
  45.  public void onStart(Intent intent, int startId) {  
  46.   // TODO Auto-generated method stub  
  47.   super.onStart(intent, startId);  
  48.   flag = true;  
  49.     
  50.   Thread th = new Thread(new myThread());  
  51.   th.start();  
  52.  }  
  53.    
  54.  class myThread implements Runnable{  
  55.   
  56.   @Override  
  57.   public void run() {  
  58.    // TODO Auto-generated method stub  
  59.    while(flag){  
  60.     helper = new MyDBHelper(getApplicationContext(), "orderinfo.db"null1);  
  61.     db = helper.getWritableDatabase();  
  62.     //查询出未支付成功的订单  
  63.     Cursor cursor = db.query("orderinfo"null"flag = ?"new String[]{"paying"}, nullnullnull);  
  64.     if (null!=cursor) {  
  65.      while(cursor.moveToNext()){  
  66.       String id_order = cursor.getString(1);  
  67.       if (null!=id_order) {  
  68.        if (isSuccess(id_order)) {  
  69.   
  70.         if (null!=m_amount) {  
  71.            
  72.          //这里填写支付成功后的逻辑,并将数据库里的对应记录置为payed  
  73.            
  74. //         Layer.pay(catcapcoin);  
  75.          ContentValues values = new ContentValues();  
  76.          values.put("flag""payed");  
  77.          db.update("orderinfo", values, "orderid = ?"new String[]{id_order});  
  78.         }  
  79.        }  
  80.       }  
  81.      }  
  82.     }  
  83.     helper.close();  
  84.     db.close();  
  85.     try {  
  86.      Thread.sleep(60000);  
  87.     } catch (InterruptedException e) {  
  88.      // TODO Auto-generated catch block  
  89.      e.printStackTrace();  
  90.     }  
  91.       
  92.    }  
  93.   }  
  94.  }  
  95.  //询问服务器订单是否支付成功  
  96.  private boolean isSuccess(String id_order){  
  97.   try {  
  98.    String str = id_order  
  99.      + "gGoXQmgHA42egR";//gGoXQmgHA42egR为secret可以自己设置也可不写,主要是考虑数据安全性  
  100.    String md5_sign = MD5(str);  
  101.    HttpGet httpRequest = new HttpGet(url);  
  102.    String strResult = "";  
  103.    // HttpClient对象  
  104.    HttpClient httpClient = new DefaultHttpClient();  
  105.    // 获得HttpResponse对象  
  106.    HttpResponse httpResponse = httpClient  
  107.      .execute(httpRequest);  
  108.    if (httpResponse  
  109.      .getStatusLine()  
  110.      .getStatusCode() == HttpStatus.SC_OK) {  
  111.     // 取得返回的数据  
  112.     strResult = EntityUtils  
  113.       .toString(httpResponse  
  114.         .getEntity());  
  115.    }  
  116.    //构造解析JSON数据对象  
  117.    JSONObject jsonObj = new JSONObject(strResult);  
  118.    //此处都是我项目中用到的参数在这里做个实例,请自行配置  
  119.    String m_status = jsonObj.getString("status");  
  120.    String m_sign = jsonObj.getString("sign");  
  121.    String m_orderId = jsonObj.getString("orderId");  
  122.    String m_ucid = jsonObj.getString("ucid");  
  123.    m_amount = jsonObj.getString("amount");  
  124.      
  125.    Log.d("UCGameSDK","支付结果获取"+ m_status);  
  126.      
  127.    String str_get = m_orderId+m_ucid+m_amount+m_status+"gGoXQmgHA42egR";  
  128.    String str_md5 = MD5(str_get);  
  129.    if (m_status.equals("success")&&m_sign.equals(str_md5)) {  
  130.     //支付成功  
  131.     return true;  
  132.    }else {  
  133.     //支付失败  
  134.     return false;  
  135.    }  
  136.   } catch (Exception e) {  
  137.    // TODO: handle exception  
  138.    return false;  
  139.   }  
  140.  }  
  141.    
  142.  private String convertToHex(byte[] data) {  
  143.         StringBuffer buf = new StringBuffer();  
  144.         for (int i = 0; i < data.length; i++) {  
  145.             int halfbyte = (data[i] >>> 4) & 0x0F;  
  146.             int two_halfs = 0;  
  147.             do {  
  148.                 if ((0 <= halfbyte) && (halfbyte <= 9))  
  149.                     buf.append((char) ('0' + halfbyte));  
  150.                 else  
  151.                     buf.append((char) ('a' + (halfbyte - 10)));  
  152.                 halfbyte = data[i] & 0x0F;  
  153.             } while(two_halfs++ < 1);  
  154.         }  
  155.         return buf.toString();  
  156.     }  
  157.  //MD5校验  
  158.     public String MD5(String text)  
  159.     throws NoSuchAlgorithmException, Exception  {  
  160.         MessageDigest md;  
  161.         md = MessageDigest.getInstance("MD5");  
  162.         byte[] md5hash = new byte[32];  
  163.         md.update(text.getBytes("iso-8859-1"), 0, text.length());  
  164.         md5hash = md.digest();  
  165.         return convertToHex(md5hash);  
  166.     }  
  167.    
  168.  @Override  
  169.  public void onDestroy() {  
  170.   // TODO Auto-generated method stub  
  171.   super.onDestroy();  
  172.   flag = false;  
  173.  }  
  174.    
  175.  @Override  
  176.  public void unbindService(ServiceConnection conn) {  
  177.   // TODO Auto-generated method stub  
  178.   super.unbindService(conn);  
  179.     
  180.  }  
  181. }  
MyDBHelper.java:数据库字段搭建

  1. package com.example.blogforuc.uc;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7.   
  8. public class MyDBHelper extends SQLiteOpenHelper{  
  9.    
  10.  private String sql_create = "create table orderinfo"+"(_id integer primary key autoincrement,orderid,flag)";  
  11.   
  12.  public MyDBHelper(Context context, String name, CursorFactory factory,  
  13.    int version) {  
  14.   super(context, name, factory, version);  
  15.   // TODO Auto-generated constructor stub  
  16.  }  
  17.    
  18.  @Override  
  19.  public void onCreate(SQLiteDatabase db) {  
  20.   // TODO Auto-generated method stub  
  21.   db.execSQL(sql_create);  
  22.  }  
  23.   
  24.  @Override  
  25.  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  26.   // TODO Auto-generated method stub  
  27.     
  28.  }  
  29.   
  30. }  

下边即支付界面:


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多