环境配置
- 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配置
文件-设置
,进入以下界面。工具-SDKManager
,安装对应的Android SDK版本。文件-新建-新建项目
,选择No Activity
,填写项目信息,选择完成后等待下载完成。- 左上角点击Android将模式切换为项目。
右键根目录-新建-Module
,把ModuleName随便填写一下。- 打开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:+'
- 点击右上角
Sync Now
同步,点击下方菜单中的构建,显示打钩即可。 - 打开Unity安装目录找到
Classes
,我使用的是IL2CPP
和Release
,所以目录是C:\Program Files\Unity\Hub\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes
,如果使用Mono
切换到Variations
选择Mono
即可,如果使用Develop
切换到il2cpp
选择Development
即可。 - 将该目录下的
classes.jar
放到项目里的libs
文件夹下即可完成UnitySDK的导入。 - 打开从支付宝官网下载的AliPaySDKDemo,点这里前往支付宝开发者中心下载,打开之后在左侧外部库里找到
alipaysdk-android-15.8.14
,将其中的classes.jar
改名为alipaysdk-android-15.8.14.jar
,同第九步丢入项目里的libs
文件夹下,如此一来,支付宝SDK和微信SDK的前置准备工作就完成了。 - 接下来在项目中右键
pay-新建-Activity-Empty Views Activity
,新建一个页面,配置如图,包名与项目包名一致。 - 如果版本比较早的可以在如图所示下找到
UnityPlayerActivity
,可以直接略过这一步。如果找不到的情况下打开C:\Program Files\Unity\Hub\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player
,找到UnityPlayerActivity.java
,放入到与MainActivity.java
同级目录下。 - 接下来对
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>
- 如果
android:label="@string/app_name"
报错,打开pay/src/main/res
下找到strings.xml
添加如下代码:
<resources>
<string name="app_name">com.unity3d.player</string>
</resources>
- 接下来对页面代码内容进行改造,如图所示
- 添加支付宝支付和微信支付的代码,如需添加回调取消注释即可。选中
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配置
- 首先使用压缩包的形式打开
pay-debug.aar
,进入如图目录。 - 使用压缩包的形式打开
classes.jar
,一路打开文件夹到最深处,删除UnityPlayerActivity.class
后关闭,询问是否保存classes.jar
时,选择是。然后打开libs,删除classes.jar
。如果这一步不这么做将来在Unity打包apk的时候因为和Unity自带的Classes.jar
和UnityPlayerActivity.class
冲突导致打包失败。 - 将
AndroidManifest.xml
拷一份出来,放到和aar同级目录下。 - 在场景中创建一个空对象名字随便起,我这边叫
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);
}
}
- 如果需要回调,直接添加方法在Java端按需添加即可,之前写的代码取消回调注释即可。
public void ALiPayResult(string result)
{
show.text = result;
}
- 进行打包测试,至此Unity端结束。
扩展:不打包aar的取巧方式
- 将支付宝SDK和微信SDK的Jar文件提取出来,拷贝至Assets/Plugin/Android目录下。
- 将修改好的
AndroidManifest.xml
和MainActivity.java
,拷贝至Assets/Plugin/Android目录下。 - 在场景中新建一个空对象命名为
GamePaySDK
,将GamePaySDK.cs
拷贝过来附加到该对象上。 - 打包测试即可。
扩展:我只通过了H5支付方式的审核?
- 网络下载一个安卓端内置浏览器的插件,本人使用的插件为UniWebView。
- 找后端要到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();
- 打包测试即可。