AndroidStudio端

新建空白项目,名字随意不是重点,新建项目完成后,点击新建Model,看下图,然后选择Android Library,点击下一步,编辑自己项目的packname,可以和Unity端的一致,点击完成,等待编译

unity ios支付sdk unity接入支付_android

unity ios支付sdk unity接入支付_c#_02

unity ios支付sdk unity接入支付_android_03

然后在左上角查看Android的目录,新建MainActivity文件,引入Unity的class包,class包在Unity的安装目录里找 \Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes下,将class包放在项目的libs文件夹下,在class文件上右键,将其作为项目的类库,等待编译,等待中可以去下载微信和支付宝的SDK,附上链接,

支付宝SDK下载     微信安卓Jar包   微信实在不友好,下载好后将微信和支付宝的Jar包都放在libs文件夹下将其作为类库

unity ios支付sdk unity接入支付_微信_04

unity ios支付sdk unity接入支付_android_05

unity ios支付sdk unity接入支付_android_06

官网已不推荐旧版的jar包接入了,再加一种方式

先说支付宝的aar包接入,依旧将aar包放入libs文件夹里

然后找到build.gradle,看下图

unity ios支付sdk unity接入支付_微信_07

微信的引用方式查看链接,好,两种方式都顾及到了,推荐使用第二种

开始写代码了,将MainActivity继承的类改为UnityPlayerActivity,这是第一步,继承Unity的类才能在Unity里调用不是,接下来就是写调起支付的代码了,上图,上代码,

unity ios支付sdk unity接入支付_unity_08

unity ios支付sdk unity接入支付_微信_09

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的通知,可以直接将微信的官方案例的拷贝过来,上图,上代码,

unity ios支付sdk unity接入支付_unity ios支付sdk_10

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 {
    //根据其他开发者反馈的问题返回商户白屏时,给出加一个连接的解决方式
    private IWXAPI api;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, "wx-appid");
        api.handleIntent(getIntent(), this);
	}
    //白屏时加的连接
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent,this);
   }
	@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文件内容拷贝过来,将报错的直接删除,然后查看微信和支付宝的文档,将双方的权限加上(合并后)

<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" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

添加好权限后需要将微信的回调界面也添加进来,直接拷贝微信案例的manifest文件,将回调界面添加进来,上图,上代码,

unity ios支付sdk unity接入支付_android_11

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.soratech.pay" >

    <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" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </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>

OK。完成接下来打包aar包,Unity2018已经渐渐的撇弃了jar包的引用,改用aar包,选中Model,Build一下,看图

unity ios支付sdk unity接入支付_android_12

已经打包出来aar包了,接下来就是需要放入Unity内进行调用了,打开Unity之前需要对aar进行加工一下,看图

unity ios支付sdk unity接入支付_微信_13

Unity端

新建工程什么的就不说了,大家都很熟悉了,新建Plugins文件夹,在文件夹下新建Android文件夹,将aar包和manifest文件放在此文件夹下,将Unity工程下manifest文件的<category android:name="android.intent.category.LAUNCHER">去掉,避免出现两个图标,我上面的代码已经去掉了,请注意,上图

unity ios支付sdk unity接入支付_android_14

打开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<AndroidJavaObject>("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的游戏物体身上,名字不一致,会影响回调执行,场景建两个按钮调用方法,完成,打包测试