天天看點

unity3d+android:支付寶

android studio:

unity3d+android:支付寶

MyAliPay代碼

package com.luoyikun.myalipay;

import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;
import com.unity3d.player.UnityPlayer;

import java.util.Map;

public class MyAliPay extends Fragment {

    String m_gameObjectName;
    String m_funcName;

    private Context unityContext;
    private Activity unityActivity;

    private static final String TAG = "MyAliPay";


    private static final int SDK_PAY_FLAG = 1;

    private static final String RESULT_SUCCESS = "9000";
    private static final String TIP_PAY_SUCCESS = "支付成功";
    private static final String TIP_PAY_FAILED = "支付失敗";

    public void UnityFunc(String gameObjectName, String funcName)
    {
        m_gameObjectName = gameObjectName;
        m_funcName = funcName;
    }

    private static MyAliPay Instance = null;

    public static MyAliPay GetInstanceByAndroid(Activity activity,Context context)
    {
        if (Instance == null)
        {
            Instance = new MyAliPay();
            Instance.unityActivity = activity;
            Instance.unityContext = context;

            activity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
        }
        return Instance;
    }

    public static MyAliPay GetInstance()
    {
        if(Instance == null)
        {
            Instance = new MyAliPay();
            //Instance.gameObjectName = gameObject;
            Instance.unityActivity = UnityPlayer.currentActivity;
            Instance.unityContext = Instance.unityActivity.getBaseContext();
            UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
        }
        return Instance;
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);  // 這一句很重要,儲存對該Fragment的引用,防止在旋轉螢幕等操作時時丢失引用(Fragment隸屬于Activity)
    }

    // 調用 Unity
    // gameObjectName 為接受消息的Unity 中 GameObject 的名字
    // functionName   為接受消息的GameObject 挂載 C# 腳本中的函數名
    // _content       為發送給Unity 的内容
    public void CallUnity( String _content)
    {
        UnityPlayer.UnitySendMessage(m_gameObjectName, m_funcName, _content);
    }

    //支付回調:同步通知
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            @SuppressWarnings("unchecked")
            PayResult payResult = new PayResult((Map<String, String>) msg.obj);
            //根據支付結果傳回的參數進行判斷,resultStatus:結果狀态
            //如果resultStatus為9000則是支付成功,否則則判定為支付失敗
            String resultStatus = payResult.getResultStatus();
            if(TextUtils.equals(resultStatus,RESULT_SUCCESS)){
                //支付成功
                Toast.makeText(unityActivity, TIP_PAY_SUCCESS, Toast.LENGTH_SHORT).show();
            }
            else {
                //支付失敗
                Toast.makeText(unityActivity, TIP_PAY_FAILED, Toast.LENGTH_SHORT).show();
            }

            //Toast.makeText(MainActivity.this, payResult.getResult(),
            // Toast.LENGTH_LONG).show();

        }
    };

    //支付方法,提供給Unity調用,info參數是伺服器加簽後傳遞給用戶端的最終請求參數.再由用戶端調用該方法的時候傳遞.
    //方法體是官方提供調用支付寶SDK支付的代碼.
    public  void PayING(final String info){

        final String orderInfo = info;   // 訂單資訊

        //支付代碼
        Runnable payRunnable = new Runnable() {


            @Override
            public void run() {
                PayTask alipay = new PayTask(unityActivity);
                Map<String, String> result = alipay.payV2(orderInfo,true);//ture表示unity到支付寶這個跳轉的過程,是否會有一個過渡的動畫

                //支付結果回調:就是執行了以上的mHandler
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必須異步調用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

    }
}      

PayResult代碼:

package com.luoyikun.myalipay;

import android.text.TextUtils;

import java.util.Map;

public class PayResult {
    private String resultStatus;
    private String result;
    private String memo;

    public PayResult(Map<String, String> rawResult) {
        if (rawResult == null) {
            return;
        }

        for (String key : rawResult.keySet()) {
            //keySet 擷取到map的所有key集合 equals 判斷key的名稱是否等于xxx
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo
                + "};result={" + result + "}";
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }
}      

修改Grade

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28



    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    compile files('libs/alipaySdk-20170725.jar')
    implementation files('libs/classes.jar')
}      

修改AndroidManifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.luoyikun.myalipay" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application android:allowBackup="true">
    <activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation|screenSize"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" >
    </activity>
    <activity
        android:name="com.alipay.sdk.app.H5AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" >
    </activity>

</application>
</manifest>      

增加混淆proguard-rules

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
    <fields>;
    <methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}      

unity3d端調用:

public static void AliPay(string info)
    {
        AndroidJavaObject pluginObject = new AndroidJavaClass("com.luoyikun.myalipay.MyAliPay").CallStatic<AndroidJavaObject>("GetInstance");
        pluginObject.Call("PayING", info);
    }      

繼續閱讀