主要流程是:调用统一下单接口获取到预付订单id,在构造参数调起微信支付,支付成功、支付失败、支付取消都会调起WXPayEntryActivity回调再回到Unity中。然后在Unity中判断状态做出相应的提示,若支付成功要向后台去查询结果。(微信文档流程)
统一下单接口调用和调起微信支付的参数都需要后台去获取,所以测试的时候可以直接使用 地址 获取到json参数来调起微信支付。
在微信支付文档中的资源下载/Android资源下载中下载范例代码,工程里面有一个lib目录,里面有两个jar包(wechat-sdk-android-with-mta-1.0.2.jar和libammsdk.jar),把libammsdk.jar直接拖到Unity的Plugins/Android目录下,就可以使用com.tencent.mm.opensdk.openapi的类了。
Android调起微信支付:
[Serializable]
public class GetPrePayData
{
public int status;
public string appid;
public string partnerid;
public string package;
public string noncestr;
public string timestamp;
public string prepayid;
public string sign;
}
Dictionary<string, string> input = new Dictionary<string, string>();
public void WechatZhifu(string jsonData)
{
AndroidJavaClass androidClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject androidObj = androidClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass apiFactory = new AndroidJavaClass("com.tencent.mm.opensdk.openapi.WXAPIFactory");
//mWeixinPayApi保存引用后可以一直调用,createWXAPI方法第一个参数为Unity的活动Activity,第二个参数为微信支付的appid
AndroidJavaObject mWeixinPayApi = apiFactory.CallStatic<AndroidJavaObject>("createWXAPI", androidObj, WxPayConfig.GetConfig().GetAppID());
input.Clear();
GetPrePayData data = new GetPrePayData();
try
{
data = JsonUtility.FromJson<GetPrePayData>(jsonData);
}
catch (Exception e)
{
Debug.LogError("微信支付统一接口数据错误");
}
input.Add("appId", data.appid);
input.Add("partnerId", data.partnerid);
input.Add("prepayId", data.prepayid);
input.Add("packageValue", data.package);
input.Add("nonceStr", data.noncestr);
input.Add("timeStamp", data.timestamp);
AndroidJavaObject request = new AndroidJavaObject("com.tencent.mm.opensdk.modelpay.PayReq");
foreach (var kv in input)
request.Set<string>(kv.Key, kv.Value.ToString());//设置参数
request.Set<string>("sign", data.sign);
mWeixinPayApi.Call<bool>("sendReq", request);//调起微信支付
}支付回调:要为应用包名创建一个wxapi/WXPayEntryActivity.java供微信调用回调方法。新建一个AndroidStudio工程,添加一个library模块,包名设置为和Unity项目应用的一样。将unity的jar包和示例文件中的libs的jar包添加到这个模块中。然后在示例文件中,复制wxapi/WXPayEntryActivity.java和Constants.java到模块/src/main/java/com...包名/下,注意修改Constants.java的APP_ID为你的应用ID,修改WXPayEntryActivity.java中包名为你应用包名,去掉视图,修改回调方法去通知Unity的某个物体的某个方法并将微信的返回代码返回给Unity,结束这个Activity就行了。
package com.zfzx.cyzx.wxapi;
import com.zfzx.cyzx.Constants;
import com.zfzx.cyzx.R;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayer;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
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("jjjjjj", "onPayFinish, errCode = " + resp.errCode);
UnityPlayer.UnitySendMessage("WechatPayRespGameObject","OnWechatPayResp",String.valueOf(resp.errCode));
finish();
}
}把这个Android模块编译成jar包,然后扔进Unity的Plugins/Android目录下。随后在Unity中新建一个物体名称为WechatPayRespGameObject,任意挂上一个脚本,声明一个方法叫OnWechatPayResp接受调,然后根据返回代码做出相应的处理。
//Android的支付回调
private void OnWechatPayResp(string code)
{
if (HallTransfer.Instance == null) return;
switch (code)
{
case "0":
HallTransfer.Instance.cnTipsBox("充值成功", 3);
break;
case "-1":
HallTransfer.Instance.cnTipsBox("充值失败", 3);
break;
case "-2":
HallTransfer.Instance.cnTipsBox("用户取消", 3);
break;
}
}对了,还需要修改AndroidManifest.xml,添加一个Activity
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true"></activity>