Android微信SDK接入总结

首先说一句,微信SDK是我见过最坑的sdk,文档写的很简略,导致开发者走了好多弯路。

好了,说下实现微信开发接入的步骤

0. 附上demo

  为了便于理解,附上测试demo和生成的APK。

  DEMO下载地址

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;
    }
}
    到此就可以实现微信的分享功能。

4. 微信SDK Sample的使用

  肯定会有同学和我遇到同样的问题,为什么微信提供的demo无法分享成功。事实是微信开发文档忘了告诉我们需要在运行demo之前将开发工具的Debug.keyStore换成它提供的KeyStore。KeyStore文件可以在SDK的demo中找到。

  由于是Eclipse项目,附上Eclipse修改debug.keystore的路径:Windows->Perferences->Android:Build->Custom debug keystore

  PS:发现SDK提供的demo中有许多分享失败的,暂时还不明真相。另外吐槽下,微信的SDK文档水平简直醉了。




对于Android应用接入微信支付,您需要按照以下步骤进行操作: 1. 在微信支付开放平台注册账号并登录。前往微信支付开放平台(https://pay.weixin.qq.com/)注册一个账号,并进行登录。 2. 创建应用并获取应用ID。在开放平台创建一个应用,并获取到对应的应用ID,这是后续接入过程中的重要标识。 3. 配置应用信息。在应用管理页面填写应用的基本信息,包括应用名称、AppID、支付回调URL等。确保信息填写准确无误。 4. 下载SDK和文档。在开放平台下载对应的微信支付SDK接入文档,以便后续进行接入操作。 5. 导入SDKAndroid项目。将下载的微信支付SDK导入到您的Android项目中,可以使用Gradle或手动导入的方式进行集成。 6. 配置权限和签名。在AndroidManifest.xml文件中添加必要的权限声明,并确保应用的签名信息与在微信支付开放平台注册时填写的一致。 7. 实现支付功能。根据微信支付开放平台提供的接入文档,按照要求实现支付功能的相关代码逻辑。 8. 发起支付请求。在合适的时机,通过调用微信支付SDK提供的API发起支付请求,并传递必要的订单信息和回调参数。 9. 处理支付结果回调。在您的应用中处理微信支付结果的回调通知,根据返回的支付结果状态进行相应的处理操作。 10. 测试和上线。在开发阶段进行测试,确保支付流程和结果正常。待测试通过后,提交应用上线并进行发布。 请注意,以上只是一个大致的流程概述,具体的接入步骤和代码实现会因应用的具体需求和技术栈而有所差异。建议您仔细阅读微信支付开放平台提供的官方文档,并根据文档中的指引进行接入操作。如果遇到问题,可以参考文档中的常见问题解答或联系微信支付开放平台的技术支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值