这篇文章前面讲的创建Android Studio工程的流程是不正确的!!!
最近帮一个群里的朋友接了一下支付宝的SDK,开发环境是Unity 5.4.x + 最新的Android Studio2.3版本,最终Android Studio输出的文件格式是aar而不是之前的jar,鉴于网上的文章大多数是基于Eclipse + jar包,所以记录一下基于Android Studio进行开发的过程,供大家参考。
首先下载最新的支付宝SDK,解压缩后找到alipay_demo和alipay_sdk文件夹,它们分别是Eclipse demo工程和是支付宝的jar包。接下来的步骤的会用到这两个文件夹里的内容。
这里的android:icon,android:label,android:roundIcon和android:theme是不需要的,删除它们。同时必须在
最后,因为我们输出的是一个库而不是一个apk,所以需要修改输出的结果,打开Gradle Scripts(Gradle是一种安卓构建脚本)下的build.gradle(Moudle:app),将第一行的:
apply plugin: 'com.android.application'
修改为:
apply plugin: 'com.android.library'
点击上方的sync now,会出现错误提示:
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 9
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile files('libs/alipaySdk-20170309.jar')
compile files('libs/classes.jar')
}
-libraryjars libs/alipaySDK-20XXXXXX.jar //这里改成你所使用的SDK jar版本
-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 *;}
public void Pay(final String orderInfo)
{
Runnable payRunnable = new Runnable()
{
@Override
public void run()
{
PayTask alipay = new PayTask(MainActivity.this);
Map 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();
}
orderInfo可以在客户端生成,需要AppId,pid以及RSA等等,这样做不安全,推荐的做法是由服务端生成订单信息并加密(生成相关的逻辑在Demo里已经给出了),然后传递给客户端,客户端支付完成后,支付宝将执行一个配置好的URL,例如通知服务端支付完毕,而客户端在支付完成后提示支付成功与否的信息只能作为参考。
package com.soulgame.magicgame;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.widget.Toast;
import com.alipay.sdk.app.PayTask;
import com.unity3d.player.*;
import java.util.Map;
public class MainActivity extends UnityPlayerActivity
{
private static final int SDK_PAY_FLAG = 1;
private static final String RESULT_SUCCESS = "9000";
private static final String TIP_PAY_SUCCESS = "支付成功";
private static final String TIP_PAY_FAILED = "支付失败";
// 支付结果回调,仅作参考,以服务端确认为准!
@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) msg.obj);
String resultInfo = payResult.getResult();
String resultStatus = payResult.getResultStatus();
if (TextUtils.equals(resultStatus, RESULT_SUCCESS))
{
Toast.makeText(MainActivity.this, TIP_PAY_SUCCESS, Toast.LENGTH_SHORT).show();
} else
{
Toast.makeText(MainActivity.this, TIP_PAY_FAILED, Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
;
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
// Unity中调用
public void Pay(final String orderInfo)
{
Runnable payRunnable = new Runnable()
{
@Override
public void run()
{
PayTask alipay = new PayTask(MainActivity.this);
Map 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();
}
}
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
[System.Serializable]
public class PayInfo
{
public string subject; // 显示在按钮上的内容,跟支付无关系
public float money; // 商品价钱
public string title; // 商品描述
}
public class AlipayUI : MonoBehaviour
{
public List
运行结果: