zoukankan      html  css  js  c++  java
  • 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() {
    
                

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

    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() {
    
                

    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同步返回结果处理

        

    支付结果获取和处理

    调用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

  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/LiTZen/p/12021728.html
Copyright © 2011-2022 走看看