Unity接入微信支付(Android)

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

首页 我的博客
粤ICP备17103704号