Android app集成微信支付

news2024/12/23 16:09:17

Android app集成微信支付

  • 鉴于微信支付的文档入口不太容易找到、以及文档中有些逻辑不通或者容易产生歧义或者缺失一些信息的情况,记录下此次接入的流程和需要关注的一些点。

  • 使用的是app支付-> APP支付产品介绍
    在这里插入图片描述
    首先阅读介绍等,了解一些基础的概念和建立共识,大体的在脑中组织微信支付的框架。

  • APP支付接入前准备

    注册申请id等。需要Android程序员提供的信息或者前提条件:

    1. 包名和签名(小写md5字符串,通过keytool或者jeb等逆向软件或者微信提供的apk获取)。
    2. 目前是2023/1/18,可能是从22年开始app必须先上架应用商店,才能申请微信支付。
  • 支付后端程序员可参考:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay-1.shtml。

APP支付开发指引

  • 参考:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_5_2.shtml。但是这个文档中没有详细的接入Android sdk的部分,多是介绍服务端、iOS、Android下单的这个过程。

  • Android sdk接入指南 核心如下:

集成sdk

  • Android studio添加Maven Central仓库,引用sdk:‘com.tencent.mm.opensdk:wechat-sdk-android:+’。未找到明确的说明wechat-sdk-android-without-mta等一些版本的区别。
  • studio提示替换成版本号,但是根据提示替换后只是把"+“号给去掉了,反而引用不到sdk了。又不确定是否当前本地的就是最新版本,所以也没有填入具体版本号(可以通过Project Structure->Dependencis查询最新版本号)。找官方文档也是指定用”+"号:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html。(这个studio的警告可以忽略,只是提醒如果指定加号会自动获取最新版本,可能产生版本依赖的问题。)
    在这里插入图片描述
  • 查看本地的C:\Users\xx.gradle\caches\modules-2\files-2.1\com.tencent.mm.opensdk\wechat-sdk-android\6.8.18\xmd5\wechat-sdk-android-6.8.18.aar:
    在这里插入图片描述
    在这里插入图片描述
    带了proguard.txt,应该不用再手动配置混淆了。studio查看的不显示proguard.txt,但看混淆后的mapping文件,应该是引用了proguard.txt,即混淆配置了、生效了,不需要手动配置。
    在这里插入图片描述
    但是比官方文档中的混淆配置少了"com.tencent.mm.sdk":
-keep class com.tencent.mm.sdk.** {
    *;
}

不确定是文档较久还是微信的程序员配置漏了。

调用sdk发起请求(支付、分享等基本类似)

  • 第一步是注册到微信:其中的动态注册广播的意义不明,也未查询到详细的介绍,暂时未注册广播。

    	// APP_ID 替换为你的应用从官方网站申请到的合法appID
    private static final String APP_ID = "wx88888888";
    
    // IWXAPI 是第三方 app 和微信通信的 openApi 接口
    private IWXAPI api;
    
    private regToWx() {
        // 通过 WXAPIFactory 工厂,获取 IWXAPI 的实例
        api = WXAPIFactory.createWXAPI(this, APP_ID, true);
    
        // 将应用的 appId 注册到微信
        api.registerApp(APP_ID);
    
       //建议动态监听微信启动广播进行注册到微信
      registerReceiver(new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
    
         // 将该 app 注册到微信
        api.registerApp(Constants.APP_ID);
       }
      }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
    
    }
    
  • 需要自己添加xml适配支持Android11启动微信(描述的很模糊,不确定targetSdkVersion 30指的是微信还是app还是二者皆是,所以保险起见必须适配了)。

    <!-- 微信sdk用于Android11及targetSdkVersion>=30, -->
        <queries>
            <package android:name="com.tencent.mm" />
        </queries>
    
  • 文档中发起请求的例子是分享,所以我把支付请求放在下面,先写接收微信回调的请求(接收微信的请求及返回值),这部分也是分享、支付是共用的。

    <activity
        android:name=".wxapi.WXEntryActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:exported="true"
        android:taskAffinity="填写你的包名"
        android:launchMode="singleTask">
    </activity>
    

    其中的name必须是:包名+.wxapi.WXEntryActivity,taskAffinity也必须是包名(此项未测试,猜测是必须)。否则不会触发回调。WXEntryActivity(demo中没有设置setContentView,即没有布局文件。且onResp和onReq最后都主动调用了finish。)实现IWXAPIEventHandler接口,但是好像只会触发回调onResp,不会触发onReq(暂不确定,因为没有走完完成的支付流程,只是打开微信后返回,触发了-2:用户取消的事件)。

    可以参考demo:https://developers.weixin.qq.com/doc/oplatform/Downloads/Android_Resource.html,页面中的点击下载:https://res.wx.qq.com/op_res/dl_hmdniBHBL1Jh2zHwHaZ-FM8YE9hTH6H6U7NKwbshR0QSgb7vH5aL4zwhtGqEt

  • SDK拉起支付:根据https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_5_2.shtml#part-6。

    IWXAPI api;
    
      PayReq request = new PayReq();
      
      request.appId = "wxd930ea5d5a258f4f";
      
      request.partnerId = "1900000109";
      
      request.prepayId= "1101000000140415649af9fc314aa427",;
      
      request.packageValue = "Sign=WXPay";
      
      request.nonceStr= "1101000000140429eb40476f8896f4c9";
      
      request.timeStamp= "1398746574";
      
      request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
      
      api.sendReq(request);
    
    • api通过上面的注册到微信获取。所需的参数通过调用服务端(由后端调用微信支付的api生成订单:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml,后端再返回给app订单数据)提供的接口获取。

    • 参数的说明见:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml。

    • 支付成功、失败、取消支付会回调WXEntryActivity(实现IWXAPIEventHandler接口)的onResp,回调中errCode值列表:

      名称描述解决方案
      0成功展示成功页面
      -1错误可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
      -2用户取消无需处理。发生场景:用户不支付了,点击取消,返回APP。
    • 不能以上面的回调值作为真正支付成功的凭据,需要服务端确定是否成功并通知客户端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++数据结构-图(详解附算法代码,一看就懂)

图&#xff08;Graph&#xff09;是一种复杂的非线性结构&#xff0c;它可以描述数据间的关系&#xff0c;被广泛使用。图 G 由两个集合 V 和 E 组成&#xff0c;记为 。V是顶点的有穷非空集合&#xff0c;E是边的集合。通常&#xff0c;也将 G 的顶点集和边集表示为 V(G) 和 E…

尚医通-登录注册搭建-JWT(二十八)

目录&#xff1a; &#xff08;1&#xff09;前台用户系统-登录注册-需求分析 &#xff08;2&#xff09;前台用户系统-登录注册-搭建环境 &#xff08;3&#xff09;前台用户系统-手机登录-基本实现 &#xff08;4&#xff09;前台用户系统-手机登录-整合JWT &#xff08;…

【JUC并发编程】使用多线程可能带来什么问题

【JUC并发编程】使用多线程可能带来什么问题? 文章目录【JUC并发编程】使用多线程可能带来什么问题?什么是多线程并发为什么会出现线程带来的安全性问题可见性问题原子性问题有序性问题活跃性问题性能问题引起线程切换的几种方式什么是多线程 多线程意味着你能够在同一个应用…

Linux的ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM及分配页释放页函数的简单介绍

Linux的ZONE_DMA&#xff0c;ZONE_NORMAL,ZONE_HIGHMEM及分配页释放页函数的简单介绍简单介绍一下页&#xff1a;Linux 区&#xff1a;分配页系统调用释放页系统调用简单介绍一下页&#xff1a; 内核把物理页作为内存管理的基本单位。 尽管处理器的最小可寻址单位通常为字(甚至…

ZooKeeper-分布式锁实现

4.11)Zookeeper分布式锁-概念 •在我们进行单机应用开发&#xff0c;涉及并发同步的时候&#xff0c;我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题&#xff0c;这时多线程的运行都是在同一个JVM之下&#xff0c;没有任何问题。 •但当我们的应用是分…

【JavaScript】实现简易购物车

&#x1f4bb;【JavaScript】实现简易购物车 &#x1f3e0;专栏&#xff1a;有趣实用案例 &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻前端…

客快物流大数据项目(一百零四):为什么选择Elastic Search作为存储服务

文章目录 为什么选择Elastic Search作为存储服务 一、​​​​​​​​​​​​​​ElasticSearch简介

【GD32F427开发板试用】懒人新手试用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;东东_dxGGN2 我收到的开发板是GD32F427R-START&#xff0c;MCU是GD32F427RKT6&#xff0c;如下图&#xff08;座机拍的见谅&#xff09; 测试流…

【C++】从0到1入门C++编程学习笔记 - 核心编程篇:内存分区模型

文章目录一、程序运行前二、程序运行后三、new 操作符C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释…

2022年回顾 | 被磨砺,被厚待

岁末年首&#xff0c; 最宜盘点过往的时光。 回顾2022团结一心&#xff0c;攻坚克难&#xff0c; 祝福2023大展宏图&#xff0c;鹏程万里。 2022我们遇到了"卷土重来"、 “挥之不去”&#xff0c; 也等到了"再也不见"和 “永远下线”。 2022是一个&…

HTML中的table标签与a标签

这里写自定义目录标题一、table标签1、什么是table标签2、table标签中长见到的标签3、例子代码及其结果二、a标签1、什么是a标签2、a标签中常见的属性3、例子代码及其结果一、table标签 1、什么是table标签 table标签表示整体的一个表格 2、table标签中长见到的标签 <tr…

基于Spring Boot和Spring Cloud实现微服务架构

首先&#xff0c;最想说的是&#xff0c;当你要学习一套最新的技术时&#xff0c;官网的英文文档是学习的最佳渠道。因为网上流传的多数资料是官网翻译而来&#xff0c;很多描述的重点也都偏向于作者自身碰到的问题&#xff0c;这样就很容易让你理解和操作出现偏差&#xff0c;…

采用特殊硬件指令对密码学算法加速

1. 引言 Armando Faz-Hermandez等人2018年论文《SoK: A Performance Evaluation of Cryptographic Instruction Sets on Modern Architectures》&#xff0c;开源代码见&#xff1a; https://github.com/armfazh/flo-shani-aesni&#xff08;C语言&#xff09; slide见&…

Java高手速成 | 多态性实战

多态性&#xff08;polymorphism&#xff09;是OOP最强大、最有用的特性。截至目前&#xff0c;多态性用到了所讲的所有其他OOP概念和特性。在通向精通Java语言编程的征程上&#xff0c;多态性是最高级别概念站点。 一个对象具有跟另一不同类的对象一样的行为&#xff0c;或者具…

QT5.14.2使用回顾

前面已有博客介绍了QT的安装和配置VS2019配置Qt5.14.2以及在线配置Qt5.15.2&#xff0c;这里再接着该版本说明下QT的使用&#xff0c;主要是汇总下之前博客中的内容&#xff1a;Ubuntu下的基本知识点&#xff08;二&#xff09;QT4.8.6工程到QT5.12.1的迁移注意前面安装时候&am…

小程序开发超好用的UI组件——Vant Weapp

Vant Weapp 是有赞前端团队开源的一套小程序 UI 组件库&#xff0c;助力开发者快速搭建小程序应用。它所使用的是 MIT 开源许可协议&#xff0c;对商业使用比较友好,官网地址&#xff1a;https://vant-contrib.gitee.io/vant-weapp/#/home 安装 Vant 组件库 在小程序项目中&a…

设计模式学习(十):lterator迭代器模式

一、什么是Iterator模式使用Java语言显示数组arr中的元素时&#xff0c;我们可以使用下面这样的for循环语句遍历数组。for (int i 0; i < arr.length; i){system.out.println(arr[i]); }请注意这段代码中的循环变量i。该变量的初始值是o&#xff0c;然后会递增为1,2&#x…

halo 1.4.17 使用Mysql 安装与配置

1 下载代码 https://github.com/halo-dev/halo/archive/refs/tags/v1.4.17.zip 2 查看1.4版本文档 https://docs.halo.run/1.4/ 1.3 使用idea打开并设置jdk 11 1.4 将h2配置成为mysql 修改前 修改后 1.5 打包成jar halo使用的是Gradle&#xff0c;打包时&#xff0c…

微软官宣裁员 10000 人。分享一些我的建议给大家

大家好&#xff01;我是韩老师。昨天&#xff0c;西雅图双雄经历着不眠之夜。早些时间&#xff0c;就有传言说 1 月 18 日&#xff0c;亚马逊会裁员 18000 人。微软要裁员的各种消息也是满天飞。北京时间昨天晚上&#xff0c;微软官方博客发了一篇标题为 Focusing on our short…

10. 元组tuple类型详解

python3 tuple类型的使用 1. 基本知识 a. 元组&#xff08;tuple&#xff09;与列表类似, 不同之处在于元组的元素(项)不能修改。 b. 元组写在小括号 () 里&#xff0c;元素之间用逗号隔开。 c. 元组中的元素类型也可以不相同。 d. 构造包含0个或1个元素的元组比较特殊, 所以…