UNITY接入支付宝(未测试可行)

来源:https://www.jianshu.com/p/f8ff4f3fb4ce

支付宝App支付快速接入文档 https://docs.open.alipay.com/204/105297/
介绍了如何接入APP支付

第一步:创建应用并获取APPID

获取APPID需要申请支付宝开发者账号
在开发者中心中创建应用,生成应用唯一标识(APPID)

Paste_Image.png

第二步:配置应用

应用创建完成后,需要给应用添加App支付功能,这样就可以在你的应用里使用App支付能力。此时该应用为开发中状态,只能在沙箱环境下进行调试。应用开发完成后,请开发者自行进行验收和安全性检查(安全性检查可参考《开放平台第三方应用安全开发指南》),验收检查完成后可申请上线。应用申请上线后,会同时申请此列表的功能,接口即生效,这个状态下的应用能够调用生产环境的接口。

根据需要签约不同的功能,这里我们选择APP支付

Paste_Image.png

还需要配置密钥
密钥生成工具在客户端SDK包里
生成后复制到应用里保存

Paste_Image.png

第三步:集成和开发

首先下载 App支付客户端DEMO&SDK
接下来我们使用android studio开发SDK插件

App支付Android集成流程

官方文档 https://docs.open.alipay.com/204/105296/

  1. 导入开发资源(SDK包)
  2. 修改Manifest
    在商户应用工程的AndroidManifest.xml文件里面添加声明:
<activity
    android:name="com.alipay.sdk.app.H5PayActivity"
    android:configChanges="orientation|keyboardHidden|navigation|screenSize"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>
 <activity
    android:name="com.alipay.sdk.app.H5AuthActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>

和权限声明:

<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" />
  1. 添加混淆规则

在商户应用工程的proguard-project.txt里添加以下相关规则:

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
    <fields>;
    <methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}

经测试,不加入混淆规则,也可以调试成功,对andoird还不是很熟悉,还是建议按照官方建议加上

  1. 支付接口调用
    需要在新线程中调用支付接口。(可参考alipay_demo实现)
    PayTask对象主要为商户提供订单支付、查询功能,及获取当前开发包版本号。
    获取PayTask支付对象调用支付(支付行为需要在独立的非ui线程中执行),代码示例:
final String orderInfo = info;   // 订单信息

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(DemoActivity.this);
                String result = alipay.payV2(orderInfo,true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
         // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

这是呼起支付宝支付界面的方法
客户端呼起并不需要密钥等信息,只需要获取服务器订单信息,完成支付后,支付宝会回调给服务器
服务器收到回调后,会通知客户端支付成功,刷新钻石等,详细见接口调用流程

SDK给UNITY调用的接口

public void StartAliPay(String orderInfo) {
        if (AliPayHelper.GetInstance().getPayActivity() == null)
            AliPayHelper.GetInstance().setPayActivity(this);

        Log.i(AppTag, orderInfo);
        //Toast.makeText(mContext, orderInfo, Toast.LENGTH_SHORT).show();
        AliPayHelper.GetInstance().StartAliPay(orderInfo);
    }

SDK调用支付宝接口

    /**
     * 开始支付
     *
     * @param orderInfo 订单信息
     */
    public void StartAliPay(final String orderInfo) {
        Activity ac = getPayActivity();

        if (ac == null) {
            Log.e(UnityActivity.AppTag, "没有设置PayTask Activity");
            return;
        }

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(getPayActivity());
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

orderStr示例如下,参数说明见"请求参数说明",orderStr的获取必须来源于服务端:

app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2&timestamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D

这里不能加入自定义的参数,否则可能会报 ALI40247(系统繁忙,请稍后再试) 错误

SDK同步返回结果处理

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();

                    Log.d(UnityActivity.AppTag,"resultInfo:"+resultInfo);
                    Log.d(UnityActivity.AppTag,"resultStatus:"+resultStatus);

                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        Toast.makeText(getPayActivity(), "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        Toast.makeText(getPayActivity(), "支付失败", Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                default:
                    break;
            }
        }

    };

支付结果获取和处理

调用pay方法支付后,将通过2种途径获得支付结果:

同步返回

商户应用客户端通过当前调用支付的Activity的Handler对象,通过它的回调函数获取支付结果。(可参考alipay_demo实现)
代码示例:

private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            Result result = new Result((String) msg.obj);
            Toast.makeText(DemoActivity.this, result.getResult(),
                        Toast.LENGTH_LONG).show();
        };
    };
异步通知

商户需要提供一个http协议的接口,包含在请求支付的入参中,其key对应notify_url。支付宝服务器在支付完成后,会以POST方式调用notify_url传输数据。

UNITY调用SDK

    public static void StartAliPay(string orderInfo)
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject m_jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

#if UNITY_ANDROID
        m_jo.Call("StartAliPay", orderInfo);
#elif UNITY_IOS

#else
        print("暂不支持...");
#endif
    }

如果顺利的话,到这里应该可以支付成功了。

参考
http://blog.csdn.net/zhangdi2017/article/details/63254563

原文地址:https://www.cnblogs.com/LiTZen/p/12021728.html

时间: 2024-10-30 22:25:39

UNITY接入支付宝(未测试可行)的相关文章

手机网站和App如何接入支付宝简易版支付功能PHP版

接入支付宝准备工作:(关于账号可以是个体商户也可以是企业账号但必须有营业执照) 1.登录蚂蚁金服开放平台  2.创建应用,应用分类网页应用和移动应用.应用提交审核审核通过后得到Appid才能调用相应的接口权限 3.添加功能:一般有扫码付,电脑网站支付,手机网站支付,APP支付.看你的需求什么.移动应用选择APP支付或者是扫码付,而网页应用分为移动端和PC端. 4.商户签约 需要提交相关的资料 一般是要求你提供你的网站地址和APP包等要求 按照支付宝要求来签约相关的支付功能 5.配置你的应用开发配

cocos2dx工程中接入支付宝sdk

1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的libs目录下,如图 (2)右键工程选择Properties,弹出如下窗口,首先选择1,其次选中2,最后点击3将拷到工程中的三个支付宝的jar包一一关联到工程中 3.  最后修改工程的AndroidManifest.xml文件,添加新的权限和支付宝的Activity,代码如下: 新权限: <uses-pe

php接入支付宝接口以及嵌入thinkphp框架

最近在写个需要简单支付的小项目,用到了支付宝接口,现已完成.把php接入支付宝的流程写在这里供像我一样的小白参考. 1.首先要有一个创建一个应用(选好自己想要的功能,关于支付的功能,貌似都需要签约) 2.下载SDK&Dome(网址https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.CBtzBF&treeId=203&articleId=105910&docType=1) 我选择的是MD5签名方式,下面

Unity接入谷歌支付

文章理由 前段时间负责Unity接入Google内购功能,一开始研究别人的技术博客时发现,他们的文章都有些年头了,有些细节的地方已经不像n年前那样了,技术永远是需要更新的,而这篇就作为2016年末的最后一篇接入谷歌内购文章写给需要的人 准备工作 1.将自己的谷歌账号,支付25美元,成为谷歌开发者账号,开发者信息随意填写(有的博客写着必须填写美国,其实我就填写的中国)2.一台安装有谷歌四件套的安卓手机以及VPN3.一个用于测试的Unity小demo,只需要做好支付按钮就好了 谷歌开发者后台的设置

【安全运维】linux系统加固(第二部分),经测试可行

前言 接续系统加固第一部分未完的内容,第二部分主要涉及关闭多余的服务,用户账户的安全策略,以及内核网络参数的优化等等. <修改系统默认的账户密码策略> 这是通过编辑  /etc/login.defs  文件相关内容实现的.和前面一样的道理,修改前需要备份,然后把"鸡蛋"放在多个"篮子"里: [[email protected] 桌面]# cp -p  /etc/login.defs /etc/login.defs_backup 使用 vim 文本编辑器编

ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇

这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付接口及同步跳转及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK 2.1.101..NET Core Runtime 2.0.6 1.新建"ASP.NET Core Web 应用程序"项目,我将它命名为AlipaySample. 2. 引入安装Nuget包 "Essensoft.AspNetCore.Alipay"

TP5.1接入支付宝实现网页/APP支付完整请求回调流程(沙箱环境)

目前互联网项目如果涉及到第三方支付模块,那么支付宝/微信无非是最好的选择,此文先以支付宝为例讲解,想了解微信支付的可以看我之后的文章,当然支付也分很多种形式,比如扫码付.当面付.声波付.调用APP付,网页直接付等等.但最常用的形式还是服务端+APP+调用支付宝APP或服务端+网页扫码/调用支付宝APP/直接支付,所以接下来我就以ThinkPHP5.1作为服务端从接入SDK到实现支付请求以及回调业务流程完整的操作讲解一下,虽然我用的是TP5.1但是TP5和TP5.1在此使用过程中没有太大的区别,无

腾腾流氓,云云更流氓(问微信怎样接入支付宝支付),手贱的赶紧点,你会感谢我的

草原上的两匹马! 打从当年微信开始布局公众号之初时,估计就已经想到了与支付宝正面冲突的场面,所以微信先来个瞒天过海,在春晚搞了个微信红包,那叫一个火呀,此时的云云隐隐感觉到些许不安. 早期的微信开发者可能都知道,微信公众号刚开始的时候接入支付要交巨额的保证金,根据行业不同,金额也不同,但也有大几万呢.这让很大一部分微型企业望而却步(老子创业时,注册公司的注册资金都免了,用个支付,你还要保证金),所以,大家果断用支付宝. 这样一来,腾哥的如意算盘算是打到自己脚面了,本打算可以用企业交的保证金拿去做

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity版本为5.5,Androad Studio 2.3.1 接下来开始讲具体操作 首先是Androad Studio的基本配置 1.创建工程,空白的就行,反正也用不到界面布局 等待创建完成 2.新建库模块: 切换到Project视图 右击你的项目 新建一个库模块-用来负责与Unity交互 当然你也可以不