Unity同时接入微信和支付宝支付 Android篇(aar包和jar包)

AndroidStudio端

新建空白项目,名字随意不是重点,新建项目完成后,点击新建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文件夹下将其作为类库

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

先说支付宝的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 {
    //根据其他开发者反馈的问题返回商户白屏时,给出加一个连接的解决方式
    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文件,将回调界面添加进来,上图,上代码,

<?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一下,看图

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

Unity端

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

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

如果有不懂的地方可以加我微信联系我,可以指导,微信S-yu12  .谢谢大家,有错误可以指出。

另外没有服务器帮忙的同学,可以微信和支付宝开发者论坛上下载  .NET的版本,将服务器的步骤集成在前端,当然不推荐啦,但是还是附上链接

微信支付.Net C#版本icon-default.png?t=M1FBhttps://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1   支付宝支付.NET C#版本icon-default.png?t=M1FBhttps://docs.open.alipay.com/54/106682/  将统一下单的接口移植到Unity内,就可以使用了,祝大家好运。

附上AS工程下载链接,资源正在审核,通过后附上

附上工程链接Unity接入微信支付宝安卓工程文件_unity微信支付接入-Android代码类资源-CSDN下载icon-default.png?t=M1FBhttps://download.csdn.net/download/songyu_95/11216393

如果单单接入支付宝的支付功能,请看免安卓代码接入支付宝icon-default.png?t=M1FBhttps://blog.csdn.net/songyu_95/article/details/96874000

  • 14
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anson_宋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值