免SDK实现微信/支付宝转帐打赏功能

安卓开发者都应该有一个属于本身的APP发布到市场,能够完善本身的技术站以外,加入广告,还能够有一份小收入。android

可是这个年代,各家的应用市场是不欢迎带广告sdk的我的开发者应用的。还好咱们能够用插件技术加入广告sdk,或者直接想一种方面实现打赏功能,让用户经过支付宝或微信转帐到本身帐户。git

免sdk实现 微信/支付宝 转帐打赏功能

安卓我的开发者若是若是想着App里实现支付打赏功能,嵌入sdk不说成本大外,基本是过不了市场审核的。那么咱们能够利用有限资源,封装组件实现一个mini型的打赏功能。github

1、支付宝转帐分析

支付宝的转帐和支付功能,均可以经过二维码打开相关的支付页面,而且用浏览器扫一扫后也是能够正常呼起正常支付页面的。那么咱们简单分析下,支付宝的二维码整个跳转确定不须要相关集成sdk的,那么到底什么样的数据格式能够作到的?数据库

在支付宝我的信息页,找到 个人二维码,截图本身的支付宝二维码,识别下,获得如下信息:canvas

qa

二维码在线解析网址移步浏览器

能够看到支付宝的支付二维码就是一个普通的http url, 而后它主要信息就存在后缀字符: apafm3kp91df7yo517 里。bash

https://qr.alipay.com/apafm3kp91df7yo517微信

网上查询后,发现果真能够经过scheme去打开支付宝转帐页面。参考app

ali

因而立刻动手实现,验证scheme方式是有效的。剩下的就是怎么封装下方面调用。微信支付

2、微信转帐分析

有了支付宝的转帐经验,咱们一样从二维码信息入手,发现微信随着版本更新,会有不少验证,直接用scheme调微信,会打开微信的一个空白网页。

分析

而后研究里下微信支付sdk,发如今接口调用的时间须要商户id,及appsecret等信息验证,这就意味这咱们单纯的没有任何身份信息去调起微信支付是不可能的。 那么咱们退而求其次,用引导方式帮用户直接打开微信扫一扫页面,文案引导用户从相册打开二维码,而后支付。

下一步,就是找到打开微信扫一扫的方法。

private void toWeChatScan() {
        try {
            //利用Intent打开微信
            Uri uri = Uri.parse("weixin://dl/scan");
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
        } catch (Exception e) {
            //若没法正常跳转,在此进行错误处理
            Toast.makeText(DinpayWeChatActivity.this, "没法跳转到微信,请检查您是否安装了微信!", Toast.LENGTH_SHORT).show();
        }
    }
复制代码

以上是网上推荐的方法,那么很不幸的是,这种方法估计在很早以前版本能够,可是如今这种方法是无效的

那么是否是高版本就没有方法里呢?继续google,发现如下方法是可行的:

/*package*/ static void startWechatScan(Context c) {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI"));
        intent.putExtra("LauncherUI.From.Scaner.Shortcut", true);
        intent.setFlags(335544320);
        intent.setAction("android.intent.action.VIEW");
    
        if (MiniPayUtils.isActivityAvailable(c, intent)) {
            c.startActivity(intent);
        } else {
            Toast.makeText(c, "未安装微信~", Toast.LENGTH_SHORT).show();
        }
    }
复制代码

二维码微信相册保存

实现微信扫一扫跳转后,用户在从相册选择二维码时,怎么样才能一眼选出咱们的目标转帐二维码呢?

观察发现微信的二维码选择相册是按照时间顺序排序,那么只要咱们的图片生成时间最新就能够排在第一位,每次新生成截图保存便可。

相关图片生成及相册保存逻辑以下:

/*package*/
    static void startWeZhi(Context c, View view) {
        File dir = c.getExternalFilesDir("pay_img");
        if (dir != null &&
                !dir.exists() && !dir.mkdirs()) {
            return;
        } else {
            File[] f = dir.listFiles();
            for (File file : f) {
                file.delete();//删除旧截图,每次用新截图,保证相册排序。
            }
        }

        String fileName = System.currentTimeMillis() + "weixin_qa.png";
        File file = new File(dir, fileName);
        if (!file.exists()) {
            file.delete();
        }

        snapShot(c, file, view);
        startWechat(c);
    }

	/**
	  * 截图保存逻辑
	  */
    private static void snapShot(Context context, @NonNull File file, @NonNull View view) {
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas();
        canvas.setBitmap(bitmap);
        view.draw(canvas);

        FileOutputStream fos = null;
        boolean isSuccess = false;
        try {
            fos = new FileOutputStream(file);
            //经过io流的方式来压缩保存图片
            isSuccess = bitmap.compress(Bitmap.CompressFormat.PNG, 80, fos);
            fos.flush();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MiniPayUtils.closeIO(fos);
        }
        if (isSuccess) {
            ContentResolver contentResolver = context.getContentResolver();
            ContentValues values = new ContentValues(4);
            values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
            values.put(MediaStore.Images.Media.ORIENTATION, 0);
            values.put(MediaStore.Images.Media.TITLE, "捐赠");
            values.put(MediaStore.Images.Media.DESCRIPTION, "捐赠二维码");
            values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
            values.put(MediaStore.Images.Media.DATE_MODIFIED,System.currentTimeMillis()/1000);
            Uri url = null;

            try {
                url = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); //其实质是返回 Image.Meida.DATA中图片路径path的转变而成的uri
                OutputStream imageOut = contentResolver.openOutputStream(url);
                try {
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, imageOut);
                } finally {
                    MiniPayUtils.closeIO(imageOut);
                }

                long id = ContentUris.parseId(url);
                MediaStore.Images.Thumbnails.getThumbnail(contentResolver, id, MediaStore.Images.Thumbnails.MINI_KIND, null);//获取缩略图

            } catch (Exception e) {
                if (url != null) {
                    contentResolver.delete(url, null, null);
                }
            }
        }
    }
复制代码

这里涉及到屏幕截图保存逻辑,须要指定截图范围,保存后,还须要通知系统媒体数据库(微信图片的获取应该是读取的系统媒体库),保证数据更新。

wechat

3、封装sdk

既然能够实现免sdk的支付打赏功能,那么咱们把这个功能封装成一个sdk,方便项目的植入。

那么本者 方便引入、简单使用,体验好等原则,实现了MiniPay开源项目

项目把微信和支付宝集成了一个支付页面,点击背景可切换打赏途径。

wechat

ali

只要一行代码便可引入本身项目

compile 'com.canking.minipay:minipay:1.0.x'
复制代码

只要一行即个启动MiniPay打赏组件

MiniPayUtils.setupPay(this, config);
复制代码

代码彻底开放,源码传送门,能够彻底自定意逻辑。

Get it on Google Play


欢迎转载,请标明出处:常兴E站 canking.win

相关文章
相关标签/搜索