主要流程是:调用统一下单接口获取到预付订单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>