1. 申请微信开发平台账号、申请appID

在微信开放平台申请账号,登录后到管理中心创建项目,我这里是Android项目,所以这里是创建移动项目。

第一步:填应用信息上传应用缩略图,这个随意传。

第二步:官网随便填(当时填了百度都没事),然后应用平台选择Android,特别注意包名要和需要开发的包名是完全一致的(如果不知道在Manifest中找),而签名则需要通过你KeyStone来决定(请看第二点)。

第三步:提交审核,只有通过审核后你才能拿到AppID和AppSecret来开发,审核时间挺久的,耐心等待。

2. 签名生成与使用

2.1 签名生成工具

到微信开放平台的资源中心去下载签名生成工具并安装到测试手机上,(链接:签名生成工具

2.2 对测试应用进行签名

必须始终使用同一个KeyStore来签名。因为签名生成工具是通过应用的包名找到应用的KeyStore,以此来生成签名的。假如更改了KeyStore必须在重新生成签名并更新到微信开放平台。

具体签名方法可以看blog(构建类型要选择release):Android Studio系列-签名打包

2.3 安装签名过的APK,并使用签名生成工具生成签名。

2.4 将生成的签名填在微信开放平台的应用签名中。

3. 实现过程

3.1 下载jar包并导入

下载地址:微信开放平台资源中心

3.2 WXEntryActivity

在包名下面创建wxapi的包,并在wxapi的包中创建WXEntryActivity继承Activity,实现IWXAPIEventHandler接口,最后在Manifest中设置Activity的exported属性为true。这条很重要,如果不是”包名.wxapi.WXEntryActivity”的路径,就获取不到返回值。下面的这个Activity的简单实现。

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    // IWXAPI 是第三方app和微信通信的openapi接口
    private IWXAPI api;
    private static final String APP_ID = "wx5f30e72504c5d0c2";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        api = WXAPIFactory.createWXAPI(this, APP_ID, false);
        api.handleIntent(getIntent(), this);
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onResp(BaseResp resp) {
        Toast.makeText(this, "errCode = " + resp.errCode, Toast.LENGTH_LONG).show();
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                //分享成功
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //分享取消
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                //分享拒绝
                break;
        }
        finish();
    }

    @Override
    public void onReq(BaseReq arg0) {

    }
}

别忘了Manifest的exported属性

<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true" />

这个Activity出现的逻辑是:MainActivity –发送请求–> 微信分享界面 –退出该界面–> WXEntryActivity

只有跳转到微信进行过操作后才会跳转到这个Activity。

3.3 MainActivity

我在这个类中发送了分享图片和文本到朋友圈的请求。

public class MainActivity extends Activity {

    private IWXAPI wxApi;
    private static final String APP_ID = "wx5f30e72504c5d0c2";
    private static final int THUMB_SIZE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 实例化
        wxApi = WXAPIFactory.createWXAPI(this, APP_ID);
        wxApi.registerApp(APP_ID);
        findViewById(R.id.btnImage).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {
                        sendImageToWX();
                        return null;
                    }
                }.execute();
            }
        });
        findViewById(R.id.btnText).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendTextToWX();
            }
        });
    }

    /**
     * 分享图片到微信朋友圈
     */
    private void sendImageToWX() {
        Bitmap bmp = getUrlBitmap();
        if (bmp != null) {
            WXImageObject imgObj = new WXImageObject(bmp);
            Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
            bmp.recycle();

            WXMediaMessage msg = new WXMediaMessage();
            msg.mediaObject = imgObj;
            msg.thumbData = bmpToByteArray(thumbBmp, true);  // 设置缩略图

            SendMessageToWX.Req req = new SendMessageToWX.Req();
            req.transaction = buildTransaction("img");
            req.message = msg;
            req.scene = SendMessageToWX.Req.WXSceneTimeline;//发送到朋友圈
//            req.scene = SendMessageToWX.Req.WXSceneSession;//发送给微信好友
            wxApi.sendReq(req);
        }
    }

    /**
     * 获取图片
     *
     * @return
     */
    private Bitmap getUrlBitmap() {
        try {
            URL url = new URL("http://b.hiphotos.baidu.com/image/pic/item/fd039245d688d43f76b17dd4781ed21b0ef43bf8.jpg");
            Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            if (bitmap.getByteCount() > 4096000) {
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = bitmap.getByteCount() / 4096000;//缩放比例
                options.inJustDecodeBounds = false;
                bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream(), null, options);
            }
            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 分享文本到朋友圈
     */
    private void sendTextToWX() {
        String text = "这是一段测试文本";
        // 初始化一个WXTextObject对象
        WXTextObject textObj = new WXTextObject();
        textObj.text = text;

        // 用WXTextObject对象初始化一个WXMediaMessage对象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = textObj;
        msg.description = text;

        // 构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("text"); // transaction字段用于唯一标识一个请求
        req.message = msg;
        req.scene = SendMessageToWX.Req.WXSceneTimeline;
//        req.scene = SendMessageToWX.Req.WXSceneSession;//发送给微信好友

        // 调用api接口发送数据到微信
        wxApi.sendReq(req);
    }

    private String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }

    private byte[] bmpToByteArray(Bitmap bmp, boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}