找回密码
 立即注册
查看: 400|回复: 0

Unity 对接 Android SDK (支付宝)

[复制链接]
发表于 2021-7-15 07:48 | 显示全部楼层 |阅读模式
环境版本

    使用Loopback4作为后端框架Unity版本:2020.3.13Android Studio:4.2.2
流程


后端组装支付宝OrderInfo传给 Unity 调用Android SDK,Android SDK 拉起支付宝
后端服务实现代码


    按照支付宝官方教程生成RSA2


    支付宝1.png


    创建 private-key.pem文件,将生成的私钥要存在此文件中。
-----BEGIN RSA PRIVATE KEY-----私钥-----END RSA PRIVATE KEY-----
    导入支付宝依赖包
const AlipaySdk = require('alipay-sdk').default;const aliUtil = require('alipay-sdk/lib/util');const urllib = require("urllib");
    实现代码
    @get("/test/create_order")    public async testPaymentFun(): Promise<string> {        const alipaySdk = new AlipaySdk({            appId: '应用id',            signType: 'RSA2',            privateKey: fs.readFileSync('./public/private-key.pem', 'ascii'),            gateway: `https://openapi.alipaydev.com/gateway.do`        });        const params = {            notifyUrl: '回调地址',            bizContent: {                out_trade_no: `${uuidv4().replace(/-/g, '')}`,                subject: encodeURIComponent('超超超级vip'),                total_amount: 1.00,                body: encodeURIComponent('超超超级vip'),                product_code: 'QUICK_MSECURITY_PAY',            }        }        const config = alipaySdk.config        const signData = aliUtil.sign('alipay.trade.app.pay', params, config)        const payInfo = new URLSearchParams(signData).toString()        return payInfo;    }支付宝android原生SDK分装

    下载支付宝aar包:alipaysdk-15.8.03.210428205839.aar使用 Android Studio 新建项目(名称随意)新建Module
<!--- 创建流程 --->File  --> new ---> new module ---> Android Library<!--- 注意:需要记住包名:com.xx.xx 后续需要在unity里面调用 --->
    将aar放入刚刚创建 Library 下的 libs 中找到 build.gradle 文件添加
repositories {       flatDir {            dirs 'libs'       } }dependencies {      ...      // 加载支付宝arr包      implementation(name:"alipaysdk-15.8.03.210428205839",ext:"aar")      ... }
    新建 AliSDKActivity.java文件
  public class AliSDKActivity {    private  String callAliObjName;    private  String cllAliFunName;  //回调方法    private static Activity _unityActivity;  // unity启动时上下文    // 获取Unity上下文   public static Activity getActivity(){        if(null == _unityActivity) {            try {                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);                _unityActivity = activity;            } catch (ClassNotFoundException e) {            } catch (IllegalAccessException e) {            } catch (NoSuchFieldException e) {            }        }        return _unityActivity;    }    // 调用unity内部方法    public static boolean callUnity(String gameObjName,String funName,String args){        try {            // 获取unity的UnityPlayer            Class<?> classType=Class.forName("com.unity3d.player.UnityPlayer");            Method method=classType.getMethod("UnitySendMessage",String.class,String.class,String.class);            method.invoke(classType,gameObjName,funName,args);            return true;        }catch (Exception e){        }        // 调用失败        return  false;    }    // **************************************    // 支付宝    // **************************************    // 调用支付宝支付    public void AliPay(final String info,String callObj,String callFun){        Toast.makeText(getActivity(),"转跳至支付宝",Toast.LENGTH_SHORT).show();        // 订单信息        final String orderInfo=info;        // 方法回调名        callAliObjName=callObj;        cllAliFunName=callFun;        // 支付代码        Runnable payRunnable = new Runnable() {            public void run() {                // 设置为沙盒模式 (需要下载支付宝沙盒app)                EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);                PayTask alipay = new PayTask(getActivity());                // true 表示unity到支付报是否有个过度动画                Map<String, String> result = alipay.payV2(orderInfo, true);                Log.i("msp", result.toString());                Message msg = new Message();                msg.obj = result;                mHandler.sendMessage(msg);            }        };        // 必须异步调用        Thread payThread = new Thread(payRunnable);        payThread.start();    };    // 请求结果回调    private Handler mHandler = new Handler() {        @SuppressWarnings("unused")        public void handleMessage(Message msg) {            PayResult payResult=new PayResult((Map<String,String>) msg.obj);            String resultStatus=payResult.getResultStatus();            // 表示支付成功            if(TextUtils.equals(resultStatus, "9000")) {                callUnity(callAliObjName,cllAliFunName,"请求成功");            }else {                callUnity(callAliObjName,cllAliFunName,"请求失败");            }        };    };}
    将Android Module 打包成 aar
build ---> Rebuild Project新建untiy项目

    将打包的aar放入到Assets/Plugins/Android目录下(没有此目录就手动创建)。新建xxx.cs
public class MyTestButton : MonoBehaviour{    // Unity dataBaes    public GameObject textGameObj;    private Text text;    // android原生代码对象    AndroidJavaObject _ajc;    private string orderInfo;    // Start is called before the first frame update    void Start()    {        text = textGameObj.transform.GetComponent<Text>();        //通过该API来实例化导入的arr中对应的类        _ajc = new AndroidJavaObject("com.xxx.xxx.AliSDKActivity");    }    // Update is called once per frame    void Update()    {    }    // 创建订单    public void MyCreatOrder()    {        // 请求后台服务器         StartCoroutine(CreatOrder());    }    // 支付    public void MyPaymentOnClick()    {        object[] bjcts = new object[] { orderInfo, "Canvas", "UpdateText" };        // 调用 Android 里面的方法         _ajc.Call("AliPay", bjcts);    }    // 修改Unity Text    private void UpdateText(string str)    {        text.text = str;    }    // unity Get 请求获取订单数据    IEnumerator CreatOrder()    {        string url = "http://192.168.3.180:3000/test/create_order";        using (UnityWebRequest webRequest = UnityWebRequest.Get(url))        {            yield return webRequest.SendWebRequest();            if (webRequest.isHttpError || webRequest.isNetworkError)            {                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text);            }            else            {                Debug.Log(webRequest.downloadHandler.text);                orderInfo = webRequest.downloadHandler.text;            }        }    }}注意:此代码支付未作校验,具体支付校验需按支付宝官方对接文档实现。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-25 22:56 , Processed in 0.104153 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表