Android开发之付款码

APP内调起微信支付宝付款码:URL Scheme跳转实战与避坑指南 URL Scheme 是移动端实现应用间跳转的基础机制,通过注册自定义协议路径,操作系统可将请求路由至目标应用并打开指定功能页面。其技术价值在于以较低适配成本打通跨应用操作链路,广泛应用于支付唤起、扫码跳转、分享回流等场景。在聚合收款与商户收银类应用中,借助 URL Scheme 从自有 APP 跳转至微信或支付宝的扫一扫与付款码页面,可显著缩短收银操作路径。由于两大平台未开放官方调起接口,实际落地需处理 Android 包可见性声明、iOS 白名单配置、多候选 Scheme 兜底及跳转失败降级等工程问题, 阅读详情

对于刚完成的付款码模块代码做一个纪录,以备后用。以前做预支付通过Netty框架搭建通信,本次通过轮询任务完成界面刷新。


效果图

知识点

  • 带头像二维码生成

  • 轮询任务

  • 场景动画

  • 旋转动画

生成二维码依赖zxing核心库

compile 'com.google.zxing:core:3.2.1'

网上copy了一份生成带头像二维码的Util类


import android.graphics.Bitmap;
import android.graphics.Canvas;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 二维码生成工具类
 */
public class QRCodeUtil {
    /**
     * 生成二维码Bitmap
     *
     * @param content   内容
     * @param widthPix  图片宽度
     * @param heightPix 图片高度
     * @param logoBm    二维码中心的Logo图标(可以为null)
     * @param filePath  用于存储二维码图片的文件路径
     * @return 生成二维码及保存文件是否成功
     */
    public static boolean createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) {
        try {
            if (content == null || "".equals(content)) {
                return false;
            }

            //配置参数
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            //容错级别
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            //设置空白边距的宽度
//            hints.put(EncodeHintType.MARGIN, 2); //default is 4

            // 图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
            int[] pixels = new int[widthPix * heightPix];
            // 下面这里按照二维码的算法,逐个生成二维码的图片,
            // 两个for循环是图片横列扫描的结果
            for (int y = 0; y < heightPix; y++) {
                for (int x = 0; x < widthPix; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * widthPix + x] = 0xff000000;
                    } else {
                        pixels[y * widthPix + x] = 0xffffffff;
                    }
                }
            }

            // 生成二维码图片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);

            if (logoBm != null) {
                bitmap = addLogo(bitmap, logoBm);
            }

            //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
            return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }

        return false;
    }

    /**
     * 在二维码中间添加Logo图案
     */
    private static Bitmap addLogo(Bitmap src, Bitmap logo) {
        if (src == null) {
            return null;
        }

        if (logo == null) {
            return src;
        }

        //获取图片的宽高
        int srcWidth = src.getWidth();
        int srcHeight = src.getHeight();
        int logoWidth = logo.getWidth();
        int logoHeight = logo.getHeight();

        if (srcWidth == 0 || srcHeight == 0) {
            return null;
        }

        if (logoWidth == 0 || logoHeight == 0) {
            return src;
        }

        //logo大小为二维码整体大小的1/5
        float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
        try {
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(src, 0, 0, null);
            canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
            canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);

            canvas.save(Canvas.ALL_SAVE_FLAG);
            canvas.restore();
        } catch (Exception e) {
            bitmap = null;
            e.getStackTrace();
        }

        return bitmap;
    }

}

生成带头像二维码调用实例(耗时操作在非UI线程执行)

 final String filePath = getFileRoot() + File.separator
                + "qr_" + System.currentTimeMillis() + ".jpg";

        //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean success = QRCodeUtil.createQRImage(content, 800, 800,myApplication.getPhotoBitmap(),filePath);

                if (success) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Bitmap resultBitmap = BitmapFactory.decodeFile(filePath);
                            codeImageView.setImageBitmap(resultBitmap);
                        }
                    });
                }
            }
        }).start();

轮训任务每隔5秒刷新金额,每隔1分钟刷新二维码,如果手动刷新了二维码需要重置每隔一分钟刷新二维码的轮训任务。

    Handler handler = new Handler();

    Runnable runnable= new Runnable() {

        @Override
        public void run() {
            requestData();
            handler.postDelayed(this, 5000);
        }
    };

    handler.postDelayed(runnable, 5000);

在销毁当前活动界面注意移除任务

handler.removeCallbacks(runnable);

场景动画是5.0以后的,使用走版本分支(仅5.0+手机支持点击放大,当然还有其他方式可以向下兼容,这里就不提了)

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            codeImageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(xxxx.this, codeImageView, "image");
                    ActivityCompat.startActivity(xxxthis, new Intent(xxx.this, xxxxx.class), compat.toBundle());
                }
            });
        }
        //......................................

ViewCompat.setTransitionName(codeImageView, "image");

如果你对场景动画还不太熟悉,可以参考博客

// http://blog.youkuaiyun.com/analyzesystem/article/details/51271941

图片旋转转圈就更简单了,多种实现方案我采用的是ObjectAnimator

 private void startRefreshAnimation() {
        //TODO 不停旋转图片
        textView.setText("正在刷新..");
        LinearInterpolator interpolator = new LinearInterpolator();
        refreshAnim = ObjectAnimator.ofFloat(refreshCode, "rotation", 0F, 360F);
        refreshAnim.setRepeatCount(-1);
        refreshAnim.setDuration(1000);
        refreshAnim.setInterpolator(interpolator);
        refreshAnim.start();
    }

 private void stopRefreshAnimation() {
        //TODO 停止旋转图片
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                refreshAnim.end();
                textView.setText("点击刷新二维码");
            }
        },500);
    }

在开发上图效果遇到一个坑,集成一个开源的二维码头像库,生成了带头像的二维码却无法扫描识别,最令人想不通的是这个库有几千start,看评论有好多好多好多bug,小生只想知道这些star怎么来的?

支付宝已开放Scheme大全:移动开发者的唤起清单与实战指南 URL Scheme是移动端App间互通的底层协议,通过特定格式的URI实现页面级跳转。在移动开发中,掌握Scheme的结构与调用原理,是构建跨应用导航、支付导流等场景的关键技术基础。Android通过Intent解析,iOS则依赖canOpenURL与白名单机制,两者均需精确匹配协议头、host、path与参数,否则极易出现拉起失败或白屏问题。支付宝作为高频支付应用,其开放的Scheme调用体系覆盖扫码、付款码、账单、蚂蚁森林等页面,为开发者提供了从宿主App直连支付宝业务的能力。一份基于实际抓包整理的支 阅读详情

相关推荐

Android 二维码收款

android 二维码收款,。。。。。。。。。。。。。。。。。。

微信支付java版v2.0_付款码支付

微信支付系列课程将讲解“刷卡支付”、“扫码支付”、“公众号支付”、“现金红包”、“企业付款”。 针对每个支付技术点课程给出“1分钟部署”和“详细讲解”的听课方式。 针对项目要求部署的,请同学认真学习“程序演示和开发流程” 针对系统学习微信支付技术点的,请认真学习“编程实现” “程序演示和开发流程”要求必须认真学习,“开发流程”讲的是微信支付开发、部署的重要信息。 学习有技术问题请qq2326321088 建议在学习微信支付的同学具有“微信服务号”和“微信企业号”的技术基础。

android生成二维码

注:本想单独提供一个示例,结果编译时老是出现如下错误,搞来搞去也没整好,先记在这里,以后再回头处理,可能跟我当前的环境有关,如介意请勿下载!!! “Error:Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'. > com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/common/BitMatrix;”

一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发

接下来的几篇文章,我会介绍一下,在实际项目中,我们会介绍,如何接入第三方支付(国外),比如纸币、找零、扫码以及刷卡等。 我们将深入探讨在接入这些支付**系统前所需的准备工作、接入过程中双方的协作方式,以及接入完成后的交付流程。这些经验均源自我的亲身开发实践。** 在这个过程中,我遇到了不少挑战,也浪费了许多宝贵的时间。因此,我迫切希望将这些经验分享给你们,以帮助你们在未来的项目中更加顺利地完成支付系统的接入。 这些支付方式在自动售卖机中尤为常见,特别是在海外,自动售卖机几乎随处可见。

前期后期 2793

Android支付宝支付的示例代码

上一篇,我们已经详细讲解了Android微信支付,今天接着为大家带来支付宝支付,支付宝支付相对微信支付要简单一些,吐槽一下,而且支付宝文档确实比微信的文档好了不少,下面开始讲解支付流程。 1、首先给出官方文档的地址 Android集成支付宝流程 2、在开始集成和开发前,首先了解一下常用的接入方式和架构建议: 支付流程.png 在开始下一步之前,给大家看看网上的很多操作. 网上的代码.png 这一大堆代码,后面还有,百来行吧,而且支付宝Demo貌似也是这么干的,估计一些新司机就有点懵逼了,至于吗?集成一个第三方的,不应该是调用越简洁越好吗,而且还是大厂的第三方,不应该啊?所以,笔者有

FileZilla Server目录显示失败的处理方法

这两天河南大暴雨挺严重导致多处停电,我远在郑州机房的服务器也断网连不上了。一直到今天下午才恢复,影响较大,有些客户要数据,可是数据因为断网拿不到。于是我想,要是能把服务器的数据备份到其他地方,比如我的本机或者另外一台电脑该多好。 于是今天一整天我都在找远程备份数据的方法,把一台服务器上的数据实时同步到另外一台上。或者两台服务器互相同步。 找了半天发现了FreeFileSync这个宝藏软件,它的原理很简单是通过ftp传输数据。 我得先在服务器上安装个ftp服务,首选filezilla server,安..

两天打鱼三天晒网 4452

android微信支付开发流程

今天做了微信支付,总结一下流程:  1.创建一个广播    public class AppRegister extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final IWXAPI msgApi = WXAPIFact

zhou12314的专栏 1682

[LVGL]:MACOS下使用LVGL模拟器

[LVGL]:MACOS下使用LVGL模拟器

LINKKEEE的博客 2456

android 扫描二维码支付,Android 扫码盒子全局接收付款码(全局事件&上层接收&多重下发)...

实现MainActivity,然后接收到的内容,通过接口回调,依次下发到各个业务String barcode = ""; // 收到的码结果String check = "0000"; //特殊码前缀 如:核销码@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if(event.getAction()==KeyEvent.AC...

weixin_39982017的博客 715

IAR链接器配置文件(.icf)实战指南:从内存映射到代码布局

本文深入解析了IAR链接器配置文件(.icf)的核心作用与实战配置方法。作为嵌入式开发的“内存地图”,.icf文件精确控制代码与数据在Flash和RAM中的布局。文章从定义存储空间、划分区域、预留栈堆,到精确放置中断向量表、代码段及初始化控制,提供了完整的配置指南与避坑技巧,帮助开发者优化内存使用,解决链接错误,是掌握嵌入式系统底层内存管理的关键。

fun88的博客 917

优化求解器性能:当分支切割算法中的gap停滞不前时如何应对

本文深入探讨了当分支切割算法求解复杂整数规划问题时,gap停滞不前的根本原因与应对策略。文章指出gap停滞源于上界(找不到更优整数解)或下界(证明过程缓慢)提升受阻,并提供了从模型改写、自定义割平面、调整搜索策略到参数调优等一系列实战方法,帮助优化工程师有效打破求解僵局,推动gap下降。

weixin_29294597的博客 381

仿集享联盟app付款码直接打开支付宝或者是微信的个人付款码功能

功能很是简单,这里记录一下,方便大家节省时间。 支付宝功能:直接打开个人付款码,如果支付未登录,会登录后在跳转到个人付款码 try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri. parse("alipayqr://platformap...

zcv5and的博客 812

RK3588 hdmirx 调试(含v4l2工具,edid编辑)

RK3588 Buildroot系统中调试HDMI-RX的过程,包括抓图、修改EDID数据、编辑EDID等操作。首先,通过logcat和寄存器信息查询HDMI-RX的状态,使用v4l2-ctl工具进行测试和修改EDID。

501846585_QQAndroid_java 2684

手机没网了,却还能支付,这是什么原理?

因为我最近的工作对都是与微信/支付宝有关,整体支付流程还是比较清楚,但是付款码为什么能离线支付确实不是很清楚,所以研究了一番,于是有了今天的文章。在聊付款码离线原理之前,我们先给不熟悉支付宝/微信支付方式同学先科普一下常见的两种支付方式。以支付宝为例,付款流程如图所示:图片来自支付宝官网第二种则是我们打开手机,展示我们的付款码,然后商家使用扫码枪等工具获取付款码完成支付,这种支付方式一般称为被扫支付(用户被扫码)。以支付宝为例,付款流程如图所示:图片来自支付宝官网。

2401_84132479的博客 4171

MetaGPT核心模块:Data Interpreter 上手实战 - 数据分析和可视化(附运行过程详解)

上篇文章我们详细解读了 DataInterpreter 的实现原理(论文),本文将开始上手实操,开始写代码用上 DataInterpreter。从最简单的例子开始,先给大家看下其运行过程,看下DataInterpreter是如何自动拆解任务,完成任务的,帮助大家构建直观认识。

同学小张的博客 371

深度强化学习 | 基于SAC算法的动态避障(ROS C++仿真)

本文介绍了基于SAC(软性演员-评论家)算法的机器人运动规划方法,通过PyTorch框架实现了端到端训练,并部署到Python和ROS C++中。实验结果显示,基于SAC算法的智能体在动态避障任务中表现良好,能实现从起点到终点的无碰撞导航。

FRIGIDWINTER的博客 8206

shape虚线运行显示实线问题

真吊,这个问题搞好好一会。mark一下。 首先 shape_dashed.xml代码:<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> <stroke androi

zrbcsdn的专栏 829

具身智能中的(VLA)算法与实践——第一讲 基础与概览

本文介绍了视觉-语言-动作(VLA)模型的基础概念及其在AI领域的重要性。VLA模型通过融合多模态数据实现具身智能,使AI系统能感知环境并执行物理动作。文章探讨了大型语言模型(LLMs)和视觉语言模型(VLMs)如何赋能具身智能,包括指令解析、场景理解和动作规划。同时提供了Python、PyTorch/TensorFlow开发环境的详细搭建指南,包含GPU配置建议和测试代码。VLA模型在机器人操作、导航、人机协作等领域具有广泛应用前景,是实现通用人工智能的关键技术。

u012133341的博客 1598

Android微信刷卡支付开发

微信开发不容易,在于各个环节的理解和疏通。 支付类型就分为几种,每种的业务也不相同,所以就困扰了很多人,我也抱怨过资料的混乱,没办法慢慢梳理。 摸索过后才知道我需要的是刷卡支付业务。公司的Android终端集成扫描功能,不需要调用微信的扫描。 1、什么是刷卡支付 刷卡支付场景就像超市收银台扫你微信上的二维码,收银台主动发起扫码请求, 扫码完成后扣取你的费用。 流程如下图

北京菜刀 1651

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

安卓APP内一键拉起微信支付宝付款码与扫一扫:Intent跳转实战与避坑指南

在移动端开发中,通过Intent跳转实现应用间页面拉起是安卓平台常见的交互方式。其原理基于隐式Intent匹配机制,允许APP快速跳转到目标应用的指定界面,从而提升操作效率。在聚合收款、商户收银等场景下,这种技术能显著减少用户切换应用的成本。具体到微信和支付宝的付款码与扫一扫功能,开发者可通过Intent或URL Scheme方式实现拉起,但需注意版本兼容性、包可见性适配及异常降级处理。本文围绕安卓端拉起微信支付宝付款码与扫一扫的完整实现方案,详细拆解Intent跳转原理、实操代码、常见问题排查及合规要点,

weixin_30846347的博客 304

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

一款支付宝收款应用源码下载,配置你的支付宝收款账号,扫一扫对方的【支付宝付款码】进行收款,支付宝接口,扫别人的付款码把钱转给自己,只需使用本应用扫一扫Ta的支付宝付款码即可收款,商城抖音聊天直播视频

一款支付宝收款应用源码下载,配置你的支付宝收款账号,扫一扫对方的【支付宝付款码】进行收款,支付宝接口,扫别人的付款码把钱转给自己,只需使用本应用扫一扫Ta的支付宝付款码即可收款,商城抖音聊天直播视频!

我的ID:sumer-work(全网同名)昵称:程序员SUMER(全网同名) 1436

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 扫码盒子全局接收付款码

扫码盒子通用接收原理 1.本质上是键盘输入事件 2.可以相应EditText的输入事件(前提是获得焦点) 首先写接收源: (假设在MianActivity接收付款码) <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edit_pay_code" android:visibilit

赵星海 2509

手机没网了,却还能支付,这是什么原理

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。Android学习PDF+学习视频+面试文档+知识点笔记【Android高级架构视频学习资源】,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

m0_60388419的博客 2050

直播源代码Android 扫码盒子全局接收付款码

1.本质上是键盘输入事件 2.可以响应EditText的输入事件(前提是获得焦点) 首先写接收源: (假设在MainActivity接收付款码) 接收代码: public ScanKeyManager scanKeyManager; private void initView(){ EditText edt = findViewById(R.id.edit_pay_code); edt.setOnEditorActionListener(new TextView.O

云豹网络科技 984

Android连扫码盒子,Android 扫码盒子全局接收付款码(全局事件&上层接收&多重下发)...

实现MainActivity,然后接收到的内容,通过接口回调,依次下发到各个业务还有另一种用EditText接收付款码的方式,地址:https://blog.youkuaiyun.com/qq_39731011/article/details/106383787String barcode = ""; // 收到的码结果String check = "0000"; //特殊码前缀 如:核销码@Overr...

weixin_33027875的博客 336
上一篇: Idea-深入github Android(四)
下一篇: Android-NDK开发(一)
AnalyzeSystem
博客等级 码龄11年 204粉丝 114原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值