新建空白项目,名字随意不是重点,新建项目完成后,点击新建Model,看下图,然后选择Android Library,点击下一步,编辑自己项目的packname,可以和Unity端的一致,点击完成,等待编译
然后在左上角查看Android的目录,新建MainActivity文件,引入Unity的class包,class包在Unity的安装目录里找 \Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes下,将class包放在项目的libs文件夹下,在class文件上右键,将其作为项目的类库,等待编译,等待中可以去下载微信和支付宝的SDK,附上链接,
支付宝SDK下载 微信安卓Jar包 微信实在不友好,下载好后将微信和支付宝的Jar包都放在libs文件夹下将其作为类库
先说支付宝的aar包接入,依旧将aar包放入libs文件夹里
然后找到build.gradle,看下图
开始写代码了,将MainActivity继承的类改为UnityPlayerActivity,这是第一步,继承Unity的类才能在Unity里调用不是,接下来就是写调起支付的代码了,上图,上代码,
import android.os.Bundle;
import android.util.Log;
import com.alipay.sdk.app.PayTask;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
private IWXAPI msgApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void aliPay(final String orderInfo){
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("GamePay", "ALiPayResult", result);
}
};
Thread payThread = new Thread(payRun);
payThread.start();
}
public void weichatPay(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);
}
}
接下来需要完成对微信支付结果的回调,新建文件夹名为wxapi,在该文件夹下新建文件WXPayEntryActivity文件,文件名必须保持一致,至于为啥必须一致,见微信官方开发文档,实现回调函数onResp,在此函数内实现对Unity的通知,可以直接将微信的官方案例的拷贝过来,上图,上代码,
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.unity3d.player.UnityPlayer;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
Log.d("Unity", "onPayFinish, errCode = " + resp.errCode);
String result = resp.errCode+"";
UnityPlayer.UnitySendMessage("GamePay", "WXPayResult", result);
finish();
}
}
下一步完善AndroidManifest.xml,你会发现Model的manifest内容很少,不要慌,向项目的manifest文件内容拷贝过来,将报错的直接删除,然后查看微信和支付宝的文档,将双方的权限加上(合并后)
添加好权限后需要将微信的回调界面也添加进来,直接拷贝微信案例的manifest文件,将回调界面添加进来,上图,上代码,
OK。完成接下来打包aar包,Unity2018已经渐渐的撇弃了jar包的引用,改用aar包,选中Model,Build一下,看图
已经打包出来aar包了,接下来就是需要放入Unity内进行调用了,打开Unity之前需要对aar进行加工一下,看图
新建工程什么的就不说了,大家都很熟悉了,新建Plugins文件夹,在文件夹下新建Android文件夹,将aar包和manifest文件放在此文件夹下,将Unity工程下manifest文件的
去掉,避免出现两个图标,我上面的代码已经去掉了,请注意,上图
打开manifest文件进行编辑,将包名更改成Unity项目的包名,如果一致可以忽略,也将.MainActivity的包名保持和项目的一致,至此,完成Android的配置,下面开始写脚本了,
新建C#脚本,名字,whatever,大家随意,上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using LitJson;
using System;
enum PayResultState
{
Succeed = 0,
Fail = -1,
Cancel = -2
}
public class PayController : MonoBehaviour
{
public Text show;
public Button btn_AliPay;
public Button btn_WeiChatPay;
public InputField inputOrderID;
static AndroidJavaObject activity;
void Awake()
{
btn_AliPay.onClick.AddListener(AliPayClick);
btn_WeiChatPay.onClick.AddListener(WeChatPay);
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity = unityPlayer.GetStatic("currentActivity");
}
#region 支付宝支付
void AliPayClick()
{
StartCoroutine(GetAliPay());
}
IEnumerator GetAliPay()
{
string url = "服务器同学给你下单链接";
WWW www = new WWW(url);
yield return www;
Debug.Log(www.text);
ShowALiPay(www.text);
}
void ShowALiPay(string orderInfo)
{
activity.Call("aliPay", orderInfo);
}
public void ALiPayResult(string result)
{
show.text = result;
}
#endregion
#region 微信支付
void WeChatPay()
{
StartCoroutine(GetWeChatPay());
}
void ShowWeChatPay(string appId, string partnerId, string prepayId, string nonceStr, string timeStamp, string sign)
{
activity.Call("weichatPay", appId, partnerId, prepayId, nonceStr, timeStamp, sign);
}
IEnumerator GetWeChatPay()
{
string url = "服务器同学给你下单链接";
WWW www = new WWW(url);
yield return www;
Debug.Log(www.text);
//将返回参数解析传给微信,调起支付
JsonData jsondata = JsonMapper.ToObject(www.text);
string appId = jsondata["appid"].ToString();
string partnerId = jsondata["partnerid"].ToString();
string prepayId = jsondata["prepayid"].ToString();
string nonceStr = jsondata["noncestr"].ToString();
string timeStamp = jsondata["timestamp"].ToString();
string sign = jsondata["sign"].ToString();
ShowWeChatPay(appId, partnerId, prepayId, nonceStr, timeStamp, sign);
}
public void WXPayResult(string result)
{
PayResultState payResult = (PayResultState)int.Parse(result);
switch (payResult)
{
case PayResultState.Succeed:
Debug.Log("支付成功");
break;
case PayResultState.Fail:
Debug.Log("支付失败");
break;
case PayResultState.Cancel:
Debug.Log("取消支付");
break;
}
}
#endregion
}
挂载在场景内名为GamePay的游戏物体身上,名字不一致,会影响回调执行,场景建两个按钮调用方法,完成,打包测试
如果有不懂的地方可以加我微信联系我,可以指导,微信S-yu12 .谢谢大家,有错误可以指出。
另外没有服务器帮忙的同学,可以微信和支付宝开发者论坛上下载 .NET的版本,将服务器的步骤集成在前端,当然不推荐啦,但是还是附上链接
微信支付.Net C#版本 支付宝支付.NET C#版本 将统一下单的接口移植到Unity内,就可以使用了,祝大家好运。
附上AS工程下载链接,资源正在审核,通过后附上
附上工程链接https://download.csdn.net/download/songyu_95/11216393
如果单单接入支付宝的支付功能,请看免安卓代码接入支付宝