Java 微信小程序自建平台开发票保存到微信卡包

Java 微信小程序自建平台开发票保存到微信卡包

  • 1 获取Access token
  • 2 获取自身的开票平台识别码
  • 3 设置商户联系方式
  • 4 获取授权页ticket
  • 5 获取授权页链接
  • 6 小程序打开授权页
  • 7 收取授权完成事件推送
  • 8 创建发票卡券模板
  • 9 上传PDF
  • 10 将电子发票卡券插入用户卡包

1 获取Access token

这里的appid和secret是公众号的,不要写小程序的。
获取 Access token

public static JSONObject getAccessToken() {String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + gzhAppId + "&secret=" + gzhAppSecret;return JSON.parseObject(HttpClientUtil.doGet(url));
}

2 获取自身的开票平台识别码

提前获取开票平台标识s_pappid,因为同一个开票平台的s_pappid都相同,所以获取s_pappid的操作只需要进行一次。只需创建一次,把卡劵s_pappid存起来。
获取自身的开票平台识别码

/*** 获取自身的开票平台识别码*/
public static JSONObject getInvoicePlatformIdentifyCode(String accessToken) {String url = String.format("https://api.weixin.qq.com/card/invoice/seturl?access_token=%s", accessToken);return JSON.parseObject(HttpClientUtil.doPost(url, new HashMap<>()));
}

3 设置商户联系方式

注意,本步骤不能忽略,否则将造成下一步获取授权页报错。
设置商户联系方式

/*** 设置商户联系方式*/
public static JSONObject setContact(String accessToken, Map<String, Object> params) {String url = String.format("https://api.weixin.qq.com/card/invoice/setbizattr?action=set_contact&access_token=%s", accessToken);return JSON.parseObject(HttpUtil.post(url, JSONObject.toJSONString(params)));
}

4 获取授权页ticket

获取授权页ticket

/*** 获取授权页ticket*/
public static JSONObject getAuthTicket(String accessToken) {String url = String.format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=wx_card", accessToken);return JSON.parseObject(HttpClientUtil.doGet(url));
}

5 获取授权页链接

获取授权页url,上一步获取的授权页ticket将作为参数传入。另外,本环节里面作为参数传入的order_id要注意保留,传递给开票平台作为向用户提供电子发票的依据。这里的授权页type=2(领取发票类型):用于商户发票已开具成功,拉起授权页后让用户将发票归集保存到卡包。
获取授权页链接

/*** 获取授权页链接*/
public static JSONObject getAuthUrl(String accessToken, Map<String, Object> params) {String url = String.format("https://api.weixin.qq.com/card/invoice/getauthurl?access_token=%s", accessToken);return JSON.parseObject(HttpUtil.post(url, JSONObject.toJSONString(params)));
}

6 小程序打开授权页

获得的授权页url(auth_url)作为传入参数,拉起微信客户端打开授权页。
小程序打开授权页

wx.navigateToMiniProgram({appId: '{appid}',path: '{auth_url}',success(res) {console.log('navigateToMiniProgram success:', res)},fail(error){console.log('navigateToMiniProgram fail:', error)},complete(res){console.log('navigateToMiniProgram complete:', res)}
})

在这里插入图片描述

7 收取授权完成事件推送

后台等待接收用户的授权完成事件。需要在微信公众平台上配置授权回调地址URL。用户同意授权将发票存入微信卡包后,微信会将发票的order_id通过回调地址URL推送过来,拿到order_id后可以查询具体的开票信息数据,然后上传发票PDF到微信,再将电子发票卡券插入用户卡包。
收取授权完成事件推送
在这里插入图片描述

/*** 微信公众号消息回调 get方法用于微信鉴权* @param signature 微信的签名,需要与自己生成的签名进行比对,相同则成功* @param timestamp 时间戳* @param nonce* @param echostr*/
@GetMapping("/callback")
public String validate(@RequestParam(value = "signature", required = false) String signature,@RequestParam(value = "timestamp", required = false) String timestamp,@RequestParam(value = "nonce", required = false) String nonce,@RequestParam(value = "echostr", required = false) String echostr) {try {log.info("签名开始");boolean flag = weChatService.verifyUrl(signature, timestamp, nonce, echostr);if (flag) {log.info("callbackCheckPass");return echostr;}log.info("callbackCheckFailure");return "error";} catch (Exception e) {log.info("callbackCheckFailure", e);return "error";}
}
/*** 处理具体的回调信息*/
@PostMapping("/callback")
public String callback(@RequestParam(name = "signature", required = false) String signature,@RequestParam(name = "timestamp", required = false) String timestamp,@RequestParam(name = "nonce", required = false) String nonce,@RequestParam(name = "echostr", required = false) String echostr,@RequestParam(name = "openid", required = false) String openid,@RequestBody String msg) {log.info("处理具体的回调信息");log.info("======微信回调msg======:" +msg);try {weChatService.handleWxCallBackMsg(msg, signature, timestamp, nonce, echostr, openid);return "success";} catch (Exception e) {log.info("handleWxCallBackMsg", e);return "error";}
}

8 创建发票卡券模板

只需创建一次,把卡劵id card_id 存起来。
创建发票卡券模板

9 上传PDF

上传发票PDF文件。此步骤获得的s_media_id起到关联PDF和发票卡券的作用,将作为参数在下一步的插卡接口中传入。
上传PDF

/*** 将电子发票PDF文件上传至微信*/
public static String uploadPdfFile(String accessToken, File file) {String url = "https://api.weixin.qq.com/card/invoice/platform/setpdf?access_token=" + accessToken;try {RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("pdf", file.getName(), RequestBody.create(MediaType.parse("application/pdf"), file)).build();Request request = new Request.Builder().url(url).post(requestBody).build();Response response  = new OkHttpClient().newCall(request).execute();if (response.isSuccessful()) {JSONObject jsonObject = JSONObject.parseObject(response.body().string());if (jsonObject.getInteger("errcode") == 0) {return jsonObject.getString("s_media_id");}}return null;} catch (Exception e) {log.info("调用微信上传PDF接口异常");e.printStackTrace();return null;}
}

10 将电子发票卡券插入用户卡包

将电子发票添加到用户微信卡包。
将电子发票卡券插入用户卡包

 /*** 将电子发票卡券插入用户卡包*/public static JSONObject invoiceInsert(String accessToken, Map<String, Object> params) {String url = String.format("https://api.weixin.qq.com/card/invoice/insert?access_token=%s", accessToken);return JSON.parseObject(PostUtil.postJson(url, JSONObject.toJSONString(params)));}

将上面的每一个步骤完成后,具体业务代码自己编写,就可以将发票保存到微信卡包。
在这里插入图片描述

参考博客:
1 小程序自建平台开发票保存到微信卡包(java篇)
2 自建平台模式:小程序开票
3 开票平台接口列表
4 商户接口列表

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分文件编译(简单学生系统)

定义学生基本信息 ①输出所有学生信息 ②删除某个学生后&#xff0c;输出所有学生信息 ③修改某个学生信息后&#xff0c;输出所有学生信息 ④查找某个学生的信息 main.c #include"k11*.h" int main(int argc, const char *argv[]) {struct student p[4]{{"…

3.js - 纹理的 magfilter、minFilter、各向异性过滤(各项异性解决倾斜模糊问题)

效果图&#xff0c;就是一个PlaneGeometry&#xff0c;加了一个贴图&#xff0c;再设置下面这些属性&#xff0c;你就放大缩小着看吧&#xff0c;反正我看不出什么来 代码 // ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitContro…

Open3D 删除点云中重复的点

目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份   构造重叠区域   合并点云获得重叠点 2、主要…

产品设计的8大步骤

产品设计&#xff0c;通俗来说就是将创新想法或概念转化为落地实体的过程。一般来说&#xff0c;一个成功的产品应当具有创新性、美观性、实用性、可持续性以及经济效益&#xff0c;从而满足用户的使用需求以及市场的发展需求。产品设计也并不是一件简单的事情&#xff0c;产品…

医院挂号系统:基于JSP和MySQL的现代化医疗预约平台

开头语&#xff1a;您好&#xff0c;我是专注于医疗系统开发的IT学长。如果您对医院挂号系统感兴趣&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术&#xff0c;B/S架构 工具&#xff1a;Eclipse&#xff0c;MyEclips…

最新CRMEB商城多商户java版源码v1.6版本+前端uniapp

CRMEB 开源商城系统Java版&#xff0c;基于JavaVueUni-app开发&#xff0c;在微信公众号、小程序、H5移动端都能使用&#xff0c;代码全开源无加密&#xff0c;独立部署&#xff0c;二开很方便&#xff0c;还支持免费商用&#xff0c;能满足企业新零售、分销推广、拼团、砍价、…

[方法] 为Cinemachine添加碰撞器

选中场景中的Cinemachine物体&#xff0c;在 Inspector 面板的最下方单击 Add Extension 下拉框&#xff0c;选择 CinemachineCollider。 之后在添加的碰撞器组件中选择要与之碰撞的层&#xff08;Collide Against&#xff09;和忽略的层&#xff08;Transparent Layers&#x…

非静压模型SWASH学习(8)——三维孤立波在锥形岛屿上的爬坡过程(Runup of solitary waves on a conical island)

三维孤立波在锥形岛屿上的爬坡过程&#xff08;Runup of solitary waves on a conical island&#xff09; 算例简介模型配置网格及参数设置网格与地形初始条件与边界条件数值求解方法输出设置模拟时间 波浪&#xff08;孤立波&#xff09;入射边界的时间序列.bnd文件模拟结果注…

机械设备制造企业MES系统解决方案介绍

机械设备制造行业涵盖了各类工业设备、工程机械、农业机械等多个领域&#xff0c;对生产精度、质量控制和效率提出了较高要求。为了提升生产效率、保证产品质量并满足客户需求&#xff0c;越来越多的机械设备制造企业引入了MES系统。本文将详细介绍MES系统在机械设备制造行业的…

5.Android逆向协议-初识HTTP和HTTPS协议

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;4.Android逆向协议-详解二次打包失败解决方案 从现在开始正式进入协议分析了。 首先客户端与服务端之…

Docker 一篇到位

目录 01. Docker使用导航 02. Build Share Run 样例 03. 理解容器 04. 安装 Docker 05. Docker 样例&#xff08;常见命令使用&#xff09; 下载镜像 启动容器 修改页面 保存镜像 docker commit docker save docker load 分享社区 docker login docker tag do…

MySQL 9.0 发布了!

从昨晚开始&#xff0c;在DBA群里大家就在讨论MySQL 9.0发布的事情&#xff0c;但是Release Note和官方文档都没有更新&#xff0c;所以今天早上一上班就赶紧瞅了下具体更新了哪些内容&#xff1f; 整体看来&#xff0c;基本没什么创新。下面是9.0新增或废弃的一些特性。 &…

【Qt知识】Geometry属性

一、走进Geometry的世界 Geometry属性是Qt框架中用于处理和操作几何形状的一系列类的集合。它包括了QPoint、QPointF、QSize、QSizeF、QRect和QRectF等。这些类分别代表点、大小、矩形等基本几何概念&#xff0c;它们的存在让图形界面的创建变得既简单又直观。 位置和尺寸。 其…

如何获取音频伴奏

如何获取音频伴奏 在今天的互联网上,有许多好听的音乐.面对这些音乐,我们有时需要伴奏音频,许多音频在网站上可以查找到,但有些不行,今天,我们要通过audacity软件截取音频伴奏. 下载audacity软件 audacity-64.exe 访问密码&#xff1a;8221 或官方网站(访问较慢) 选择简体…

Modbus TCP与TCP/IP协议间的差异与应用场景

Modbus TCP概述 Modbus协议简介 Modbus是一种专为工业自动化系统设计的通信协议&#xff0c;采用主从模式&#xff0c;即一个主设备&#xff08;通常是计算机或可编程逻辑控制器&#xff09;与多个从设备&#xff08;如传感器、执行器等&#xff09;进行通信。Modbus协议具有…

(漏洞检查项) | 任意文件包含漏洞 file-include

(漏洞检查项)|任意文件包含漏洞 file-include 漏洞场景 1.含有动态包含语句 2.有类似于文件读取的url 漏洞描述 攻击者可以利用任意文件包含漏洞&#xff0c;读取任意文件&#xff0c;对服务器造成危害。 程序开发人员为了代码的灵活性&#xff0c;常常会将包含文件的路径…

Spring Cloud Circuit Breaker基础入门与服务熔断

官网地址&#xff1a;https://spring.io/projects/spring-cloud-circuitbreaker#overview 本文SpringCloud版本为&#xff1a; <spring.boot.version>3.1.7</spring.boot.version> <spring.cloud.version>2022.0.4</spring.cloud.version>【1】Circu…

KVM性能优化之CPU优化

1、查看kvm虚拟机vCPU的QEMU线程 ps -eLo ruser,pid,ppid,lwp,psr,args |awk /^qemu/{print $1,$2,$3,$4,$5,$6,$8} 注:vcpu是不同的线程&#xff0c;而不同的线程是跑在不同的cpu上&#xff0c;一般情况&#xff0c;虚拟机在运行时自身会点用3个cpus&#xff0c;为保证生产环…

TensorRT学习(二)TensorRT使用教程(Python版)

本文适合快速了解TensorRT使用的整体流程,具体细节还是建议参考TensorRT的官方文档。 加速原理: 加速原理比较复杂,它将会根据显卡来优化算子,以起到加速作用(如下图所示)。简单的来说,就是类似于你出一个公式1+1+1,而你的显卡支持乘法,直接给你把这个公式优化成了1*…

windows远程连接无法复制文件

windows远程桌面无法复制文件 解决方案 打开任务管理器管理器,在详细信息界面,找到rdpclip.exe进程&#xff0c;选中并点击结束任务&#xff0c;杀死该进程。 快捷键 win r 打开运行界面&#xff0c;输入 rdpclip.exe &#xff0c;点击确定运行。即可解决无法复制文件问题。…