参考连接:http://blog.youkuaiyun.com/rcfalcon/article/details/52518700
http://blog.youkuaiyun.com/yupu56/article/details/72772383
因为项目已经用android studio集成过讯飞语音测。所以集成微信也从AS入手。
先说坑点:
1、路径:微信支付和分享如果不绕过审核。必须有回调脚本且路径必须在包下面的wxapi文件夹里这个在我集成sharesdk过程中折腾了半天。因为里面已经单独有分享回调了。此图是我合并xml和把分享回调脚本单拎出来放入wxapi的。
2、签名:通过微信资源下载下载签名工具。安装app后输入包名返回签名。填下到微信开放平台里
3、最坑点:根据微信资源中心AS集成文档集成方法Android Studio环境下:已改用gradle形式,发布到jcenter( http://jcenter.bintray.com/),请开发者使用gradle来编译、更新微信SDK。 导入后。createWXAPI必定闪退。改为手动导入libammsdk.lib包后就不会闪退了。
开始接入sdk。此方法有后台支持。无后台支持直接参考上面第一个连接,我没试。
这个代码基本全是第一个连接改的有后台版本。不需要在AS里写代码,很方便。
AndroidJavaObject WXApi
{
get
{
if (_wxApi == null)
{
AndroidJavaClass apiFactory = new AndroidJavaClass("com.tencent.mm.sdk.openapi.WXAPIFactory");
_wxApi = apiFactory.CallStatic<AndroidJavaObject>("createWXAPI",
currentActivity,
"微信appid",
false
);
}
return _wxApi;
}
}
static AndroidJavaObject _wxApi;
/// <summary>
/// 微信支付接口
/// </summary>
/// <param name="payInfo">支付信息</param>
/// <returns></returns>
public IEnumerator WeiXinPay(PayInfo payInfo) {
//payinfo包含和后台沟通参数。
Dictionary<string, string> headdress = new Dictionary<string, string>
{
// { "Cookie",/*这里用户登陆后请求下的cookie。用于和服务端确认用户。
// www.responseHeaders["SET-COOKIE"] */) }
};
string data = "参数1=x&参数2=y&参数3=z";//传多个参数方法
byte[] bs = System.Text.Encoding.UTF8.GetBytes(data);
WWW www = new WWW("url", bs, headdress);
yield return www;
if (www.error != null)
{
Debug.Log(www.error);
}
else
{
var userOrder = JsonMapper.ToObject(www.text);
print(userOrder["message"]);
if (userOrder["errno"].ToString() == "0")
{
var orderInfo = userOrder["result"];
Dictionary<string, string> paras = new Dictionary<string, string>();
//BY CG:由于wechat android sdk中的变量与签名标志不一致,所以分开写,#前面是签名属性,后面对应的SDK中变量名
paras.Add("appid#appId", orderInfo["appid"].ToString());
paras.Add("partnerid#partnerId", orderInfo["partnerid"].ToString()); //商户号
paras.Add("prepayid#prepayId", orderInfo["prepayid"].ToString());
paras.Add("package#packageValue", "Sign=WXPay"); //暂填写固定值Sign=WXPay
paras.Add("noncestr#nonceStr", orderInfo["noncestr"].ToString()); //随机字符串
paras.Add("timestamp#timeStamp", orderInfo["timestamp"].ToString());
paras.Add("sign#sign", orderInfo["sign"].ToString()); //应用签名
var request = new AndroidJavaObject("com.tencent.mm.sdk.modelpay.PayReq");
foreach (var kv in paras)
{
request.Set(kv.Key.Split('#')[1], kv.Value);
}
bool ret = WXApi.Call<bool>("sendReq", request);
}
else
{
}
}
}
在xml中需要添加
<!--<!–微信支付–>-->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
然后是微信支付回调方法
注:android studio中。 包名下wxapi文件夹下WXPayEntryActivity脚本里。
package com.shuoshuoshuo.englishtongue.wxapi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.shuoshuoshuo.englishtongue.MainActivity;
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.unity3d.player.UnityPlayer;
//import com.tencent.mm.opensdk.utils.Log;
import net.sourceforge.simcpux.Constants;
//必须实现接口,重写方法
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
}catch (Exception e){
finish();
}
api = WXAPIFactory.createWXAPI(this,"微信appid");
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
int retCode = baseResp.errCode;
//返回结果发送给unity 处理
UnityPlayer.UnitySendMessage("","WXPayCallback", String.valueOf(retCode));
//跳转界面 需要跳转的active要填写正确
Intent intent=new Intent(this, MainActivity.class);
this.startActivity(intent);
finish();
}
}
}