环境配置

  • Unity版本:2021.3.11f
  • Android Studio版本:2022.2.1 Patch 2 内部版本号#AI-222.4459.24.2221.10121639
  • JDK版本17.0.6
  • Android API 最低级别:Android 6.0(API Level 23)

Android Studio配置

  1. 文件-设置,进入以下界面。 JDK设置
  2. 工具-SDKManager,安装对应的Android SDK版本。 SDK PlatformsSDK Tools
  3. 文件-新建-新建项目,选择No Activity,填写项目信息,选择完成后等待下载完成。 新建项目1新建项目2
  4. 左上角点击Android将模式切换为项目。 项目模式目录
  5. 右键根目录-新建-Module,把ModuleName随便填写一下。 Module配置
  6. 打开pay项目下的build.gradle,在dependencies中填写如下两句话之后。
//导入libs文件夹下后缀为.jar和.aar的文件,这里用于支付宝和Unity的SDK存放
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
//导入微信的SDK,从网络直接下载到库中
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
  1. 点击右上角Sync Now同步,点击下方菜单中的构建,显示打钩即可。
  2. 打开Unity安装目录找到Classes,我使用的是IL2CPPRelease,所以目录是C:\Program Files\Unity\Hub\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes,如果使用Mono切换到Variations选择Mono即可,如果使用Develop切换到il2cpp选择Development即可。
  3. 将该目录下的classes.jar放到项目里的libs文件夹下即可完成UnitySDK的导入。
  4. 打开从支付宝官网下载的AliPaySDKDemo,点这里前往支付宝开发者中心下载,打开之后在左侧外部库里找到alipaysdk-android-15.8.14,将其中的classes.jar改名为alipaysdk-android-15.8.14.jar,同第九步丢入项目里的libs文件夹下,如此一来,支付宝SDK和微信SDK的前置准备工作就完成了。 AliPaySDKDemo的界面
  5. 接下来在项目中右键pay-新建-Activity-Empty Views Activity,新建一个页面,配置如图,包名与项目包名一致。 Activity配置
  6. 如果版本比较早的可以在如图所示下找到UnityPlayerActivity,可以直接略过这一步。如果找不到的情况下打开C:\Program Files\Unity\Hub\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player,找到UnityPlayerActivity.java,放入到与MainActivity.java同级目录下。 Unity的Jar
  7. 接下来对AndroidManifest.xml进行改造,打开pay/src/main目录下的AndroidManifest.xml修改为如下代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player">

    <!--ZFB支付权限-->
    <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" />
    <!--WX支付权限-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <application>
        <activity android:name="com.unity3d.player.MainActivity" android:exported="true" android:label="@string/app_name" android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
        <!--<activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"/>-->
    </application>

</manifest>
  1. 如果android:label="@string/app_name"报错,打开pay/src/main/res下找到strings.xml添加如下代码:
<resources>
    <string name="app_name">com.unity3d.player</string>
</resources>
  1. 接下来对页面代码内容进行改造,如图所示 需要修改的地方画了红圈
  2. 添加支付宝支付和微信支付的代码,如需添加回调取消注释即可。选中pay-点击构建-Make Module 'SuiBianXieGe.pay'编译aar,然后将build/output目录下构建好的pay-debug.aar拷贝至Unity端的Assets/Plugin/Android目录下,至此Android Studio部分完毕。完整代码如下:
package com.unity3d.player;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.alipay.sdk.app.PayTask;

public class MainActivity extends UnityPlayerActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    /**
     * 支付宝App支付
     */
    public void AliPayByApp(final String orderInfo){
        Log.i("Unity", "启动线程");
        Runnable payRun=new Runnable() {
            @Override
            public void run() {
                PayTask task=new PayTask(MainActivity.this);
                String result= task.pay(orderInfo, true);
                Log.i("Unity", "onALIPayFinish, result = " + result);
                //支付回调
                //UnityPlayer.UnitySendMessage("GamePaySDK", "ALiPayResult", result);
            }
        };
        Thread payThread = new Thread(payRun);
        payThread.start();
    }

    private IWXAPI msgApi;
    /**
     * 微信App支付
     */
    public void WxPayByApp(String appId,String partnerId,String prepayId,String nonceStr,String timeStamp,String sign){
        msgApi = WXAPIFactory.createWXAPI(this, appId);
        PayReq request = new PayReq();
        request.appId = appId;
        request.partnerId =partnerId;
        request.prepayId= prepayId;
        request.packageValue = "Sign=WXPay";
        request.nonceStr= nonceStr;
        request.timeStamp= timeStamp;
        request.sign=sign;
        Log.d("Unity",request.checkArgs()+"");//输出验签是否正确
        msgApi.sendReq(request);
    }
}

Unity配置

  1. 首先使用压缩包的形式打开pay-debug.aar,进入如图目录。 pay-debug.aar的目录
  2. 使用压缩包的形式打开classes.jar,一路打开文件夹到最深处,删除UnityPlayerActivity.class后关闭,询问是否保存classes.jar时,选择是。然后打开libs,删除classes.jar。如果这一步不这么做将来在Unity打包apk的时候因为和Unity自带的Classes.jarUnityPlayerActivity.class冲突导致打包失败。
  3. AndroidManifest.xml拷一份出来,放到和aar同级目录下。
  4. 在场景中创建一个空对象名字随便起,我这边叫GamePaySDK,新建一个脚本也叫GamePaySDK,编写如下代码,按需调用即可。
public partial class GamePaySDK : MonoBehaviour
{
    private AndroidJavaObject activity;

    private void Start()
    {
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
    }

    private void AliPayByApp(string orderInfo)
    {
        //activity.Call("AliPayByApp", url);
    }

    private void WxPayByApp(string appId, string partnerId, string prepayId, string nonceStr, string timeStamp, string sign)
    {
        activity.Call("WxPayByApp", appId, partnerId, prepayId, nonceStr, timeStamp, sign);
    }
}
  1. 如果需要回调,直接添加方法在Java端按需添加即可,之前写的代码取消回调注释即可。
public void ALiPayResult(string result)
{
    show.text = result;
}
  1. 进行打包测试,至此Unity端结束。

扩展:不打包aar的取巧方式

  1. 将支付宝SDK和微信SDK的Jar文件提取出来,拷贝至Assets/Plugin/Android目录下。
  2. 将修改好的AndroidManifest.xmlMainActivity.java,拷贝至Assets/Plugin/Android目录下。
  3. 在场景中新建一个空对象命名为GamePaySDK,将GamePaySDK.cs拷贝过来附加到该对象上。
  4. 打包测试即可。

扩展:我只通过了H5支付方式的审核?

  1. 网络下载一个安卓端内置浏览器的插件,本人使用的插件为UniWebView。
  2. 找后端要到url后,使用如下代码打开即可调起相应App。
//H5临时支付方式
if (_uniWebView == null)
{
    _uniWebView = gameObject.AddComponent<UniWebView>();
}
_uniWebView.Frame = new Rect(0, 0, Screen.width, Screen.height);
_uniWebView.Load(url);
_uniWebView.Show();
  1. 打包测试即可。

下载地址

Android工程地址

最后修改:2024 年 05 月 16 日
如果觉得我的文章对你有用,请随意赞赏