对接微信米大师虚拟支付2.0文档

2023-11-08

话不多说 上代码;

    //支付密钥算法

    public static String calcPaySig(String uri, String postBody, String appKey) {
        String needSignMsg = uri + "&" + postBody;
        try {
            Mac sha256Hmac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKey = new SecretKeySpec(appKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            sha256Hmac.init(secretKey);
            byte[] hmacBytes = sha256Hmac.doFinal(needSignMsg.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte hmacByte : hmacBytes) {
                String hex = Integer.toHexString(0xff & hmacByte);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 签名密钥算法
    public static String calcSignature(String postBody, String sessionKey) {
        String needSignMsg = postBody;
        try {
            Mac sha256Hmac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKey = new SecretKeySpec(sessionKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            sha256Hmac.init(secretKey);
            byte[] hmacBytes = sha256Hmac.doFinal(needSignMsg.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte hmacByte : hmacBytes) {
                String hex = Integer.toHexString(0xff & hmacByte);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
            return null;
        }
    }

 业务代码:

 /**
     * 虚拟支付2.0
     * pay_v2.getBalance
     *
     * @param dto
     * @return
     */
    public MidasBalanceV2VO balanceV2(MidasBalanceV2DTO dto) {

        OrderInfo orderInfo = orderInfoRepo.getByOrderNumber(dto.getOrderNumber());
        String sessionKey = wxApiSessionKeyAndOpenIdRedis.retrieve(dto.getOpenid())[0];
        if (Objects.isNull(orderInfo))throw new AppException(ErrorCode.ORDER_INFO_NO_EXIST);

        WxAppletConfig wxConfig = gameAppRepo.getByAppNumber(dto.getAppNumber()).getWxAppletConfig();
        if (Objects.isNull(wxConfig) || StringUtils.isBlank(wxConfig.getWxAppletAppId()) || StringUtil.isBlank(wxConfig.getWxAppletSecret())) {
            throw new AppException(ErrorCode.SYS_ERROR.code(), "应用未配置小程序信息");
        }
        GetBalanceParamV2 paramV2 = new GetBalanceParamV2(wxConfig.getMidasOfferId(),dto.getOpenid(),dto.getTs(), dto.getZoneId(), wxConfig.getMidasEnv());
        String postBody = JsonUtils.Object2Json(paramV2);
        String signature = calcSignature(postBody, sessionKey);
        String appKey = wxConfig.getMidasSecret();
        String paySig = calcPaySig(BALANCE_URI, postBody, appKey);
        String accessToken = wxApiService.authGetAccessTokenForMidas(wxConfig.getWxAppletAppId(), wxConfig.getWxAppletSecret());
        GetBalanceResultV2 balanceResultV2 = MidasPayUtil.getBalanceV2(signature,paySig,accessToken,postBody);

        if(balanceResultV2.getErrCode() != 0){
            log.error("【订单编号:{}】;调用微信接口出错:余额不足",orderInfo.getOrderNumber());
            throw new AppException(ErrorCode.PAY_WECHAT_INTERFACE_ERROR.code(), balanceResultV2.getErrMsg());
        }
        return getMidasBalanceV2VO(orderInfo, wxConfig, balanceResultV2);
    }

注意再经过wx.auth2Session()获取的wx.code只能使用一次,否者会出现 code been used..错误。所以再微信授权的时候把auth2Session返回的结果集中的sessionKey丢再redis中,通过hash结构来存储取出。

另外切记切记postbody中的Filed一定要加下划线来请求 !! (被这个无关紧要的问题给卡住了两天,最后发现是offerId要改为offer_id 微信那边才能识别出你的offer_id,不然识别不出!)


getBanlanceV2(2.0版本)
 

    /**
     * 虚拟支付2.0 【查询余额】
     *
     * 获取余额 pay_getBalance
     * POST https://api.weixin.qq.com/wxa/game/getbalance?access_token=ACCESS_TOKEN&signature=SIGNATURE&sig_method=SIG_METHOD&pay_sig=PAY_SIGNATURE
     *
     */
    public static GetBalanceResultV2 getBalanceV2(String signature, String paySig, String accessToken, String postBody) {
        // 0 米大师正式环境 1 米大师沙箱环境 https://api.weixin.qq.com/wxa/game/
        String url =  MIDAS_API_BASE_URL + "getbalance"
                                         + "?access_token="+accessToken
                                         + "&signature="+signature
                                         + "&pay_sig="+paySig;

        try {
            log.info("微信API:{}",url);
            HashMap<String, String> headers = new HashMap<>();
            headers.put("Content-Type", "application/json");
            log.info("body:{}",postBody);
            String postForm = HttpUtil.post(url, postBody, headers);
            log.info("返回参数:{}", postForm);
            return JSONObject.parseObject(postForm, GetBalanceResultV2.class);
        } catch (Exception e) {
            log.info("微信API:{},异常信息:{}", url, e);
            throw new AppException(ErrorCode.SYS_ERROR.code(), e.getMessage());
        }
    }

大家就作为一个参考吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对接微信米大师虚拟支付2.0文档 的相关文章

  • 获取微信小程序码实例,建议拿到字节流后可以base64编码再上传图片,得到图片地址进行使用

    接口调用凭证 access token public static String postToken String appId String appKey throws Exception String requestUrl https a
  • [免签约]微信+支付宝个人收款解决方案

    方案原理 使用一台闲置的安卓手机专门用来做收款 收到付款时手机会有通知提示 对该通知进行监控 监控到后发送数据到服务器 服务器根据订单情况支付情况判断是否成功完成一轮下单支付操作 如果成功则自动发货 具体实现流程 网页前端展示商品 用户浏览
  • SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录

    大家好 我是宝哥 一 概述 实现账号用户名 微信网页授权登录集成在Spring Security的思路 最重要的一点是要实现微信登录通过Spring Security安全框架时 不需要验证账号 密码 二 准备工作 要实现该功能 首先需要掌握
  • 微信小程序强制更新

    目录 冷启动 热启动 小程序更新机制 强制更新方案 如何测试 冷启动 热启动 冷启动 如果用户首次打开 或小程序销毁后被用户再次打开 此时小程序需要重新加载启动 即冷启动 热启动 如果用户已经打开过某小程序 然后在一定时间内再次打开该小程序
  • java版微信和支付宝 支付的调起 和 回调

    写下项目中经常用到的微信和支付宝支付的拉起和回调的代码 1 支付参数和退款参数的封装 package co yixiang modules storePaymentOrder payment dto import lombok Data 支
  • 利用java完成图像文字识别和翻译,实现拍照翻译的功能

    需求 利用java完成图像文字识别和翻译 实现拍照翻译的功能 可拆分为以下两个小的功能逐一完成 1 实现图像文字识别 2 将识别出来的文字进行翻译 1 实现图像文字识别 利用Tess4J进行图像文字识别 1 1 为方便集成tess4j的ja
  • 微信支付——微信退款实战教程(Java版)

    微信支付之微信申请退款实战 Java版 微信支付业务场景 一 注意事项 二 微信支付退款案例 1 微信退款案例 二 微信支付官方说明 总结 微信支付业务场景 当交易发生之后一年内 由于买家或者卖家的原因需要退款时 卖家可以通过退款接口将支付
  • Python获取微信好友地址以及性别并生成可视化图表

    简介 使用python批量获取微信好友地址 需要使用itchat库 这个库是用的网页版微信的接口进行数据获取的 所以你想测试这个功能必须要你的微信能够登录网页版微信 之前的itchat uos模块使用了统信版的接口绕过了腾讯的检测 所有的微
  • 简单的小程序聊天对话窗口界面

    一个简单的微信小程序聊天对话窗口界面 包括发送文本功能 直接上代码 js代码 简单版 Page data content 当前登录者信息 login id 2023 user 大猪蹄子 avatar https img2 baidu com
  • Java实现企业微信上传临时文件获取media_id

    目录 1 上传临时素材API 2 测试代码 3 测试完成 4 遇到的问题 4 1 文件类型无法解析 1 上传临时素材API 调试工具 素材上传得到media id 该media id仅三天内有效 media id在同一企业内应用之间可以共享
  • 答题微信小程序实现(7):python3将题库处理成json格式的。

    通常来说 我们写答题程序的时候 拿到手的题库不会是json格式的 而是word或txt pdf就像考试卷子那样的 这里写一下用python3将普通题库处理成json格式 选择python3的原因是 相对于2 7版本 它对中文更友好 原始题库
  • Ubuntu系统下安装微信

    安装微信实现截图发送图片功能 1 打开终端输入命令 更新软件源 sudo apt get update 2 输入以下命令 一定注意 O 中间是大写字母O 不是0也不是小写o wget O https deepin wine i m dev
  • 用户互动优化:微信营销系统实践

    在当今移动互联网时代 微信已经成为企业进行营销的重要平台之一 而用户互动作为营销的关键环节 对于提升品牌影响力 增强用户忠诚度至关重要 本文将深入探讨如何通过微信营销系统实践 优化用户互动 提升营销效果 建立更紧密的用户关系 1 理解用户互
  • 单片机生成PDF文件(STM32+LIBHARU)

    之前发过一个帖子 是STM32移植了一个pdf库 不过那个库功能比较简单 有很多东西都没有 比如加载图片和文件加密 这次主要是为了文件加密 翻阅了一下资料 单片机做PDF文件 网上资料不是很多 可以说基本上找不着 github上翻源码 翻了
  • 微信JS-SDK获取signature签名以及config配置(微信转发分享页面需要)

    Js代码 wx config debug true 开启调试模式 调用的所有api的返回值会在客户端alert出来 若要查看传入的参数 可以在pc端打开 参数信息会通过log打出 仅在pc端时才会打印 appId 必填 公众号的唯一标识 t
  • H5微信分享记录

    最近做H5微信分享 用的微信jssdk来做 现记录下一些过程和遇到的问题 一 公众号配置 微信官方文档 已经说明了使用步骤 公众号配置比较模糊 主要是要配置ip白名单和绑定js接口安全域名 1 检查分享接口权限是否已获得 在微信公众号的 设
  • 微信支付商家转账到零钱功能使用教程

    之前的 企业付款到零钱 功能 微信支付已下架 以后用 商家转账到零钱 功能取代 下面介绍如何开通并使用该功能 从运营账户支出 首先需要先去了解一下微信支付的这3个账户的关系 商家转账到零钱 功能 是从运营账户转账给用户的 开通 商家转账到零
  • CSDN平台上怎么样才能赚钱?

    CSDN平台上有多种方式可以赚钱 以下是其中几种常见的 1 写作赚钱 CSDN平台鼓励用户积极创作原创技术博客 通过博客的阅读量和转发量来获取广告收益 用户还可以发表付费文章或参与付费专栏 在文章的阅读量和付费订阅量上获得收入 2 交流赚钱
  • 微信使用精准位置 wx.getLocation步骤

    微信小程序 gt 开发设置 gt 接口设置 gt 开通 wx getLocation 申请理由 应当前业务涉及周边服务推荐需要 需获取用户地理位置信息 调试基础库 2 24 4 在app json中添加 requiredPrivateInf
  • 微信游戏如何开发

    中懿游游戏软件开发 微信游戏开发通常涉及使用微信小游戏平台进行开发 微信小游戏是一种在微信平台上运行的轻量级游戏 用户可以在微信中直接体验 无需下载安装 以下是在微信平台上开发小游戏的一般步骤 1 注册微信开发者账号 访问 微信开放平台 注

随机推荐

  • python 实现批量抠图

    系统 windows10 语言 python 3 6 编辑器 pycharm 安装库 1 paddlepaddle python m pip install paddlepaddle i https mirror baidu com pyp
  • ES Module 和 Commonjs 的区别

    只有静态引入 tree shaking才能够知道哪些引入哪些不引入 动态引入 要引入的代码都没有执行 所以不会引入 所以tree shaking不知道哪些引入哪些不引入
  • 只利用 phpstudy 如何运行PHP文件 超详细教程

    1 先编写好PHP代码 我这里用记事本简单写了一个 2 打开phpstudy 检查下有没有下载PHP环境 启动Apache 3 把编写好的PHP文件复制到phpstudy目录下的www文件中 注 phpstudy可以通过 网站 管理 打开根
  • Vue常见简写 “:“ , “@“ , “#“ :帮助刚入行的伙伴快速看懂代码

    提示 本文仅仅是对Vue中比较常见的简写进行总结 适合刚入行有时看不懂代码的朋友 目录 文章目录 前言 一 是什么 1 是什么意思 2 怎么使用 二 是什么 1 是什么意思 2 怎么使用 三 是什么 1 是什么意思 2 怎么使用 总结 前言
  • JDBC 学习笔记(基础)

    示意图 目录 创建 JDBC 应用 例子 通过本地协议纯 Java 驱动程序实现JDBC 代码具体步骤 1 注册驱动 2 建立与数据库的连接 3 获取执行SQL语句的对象 Statement 4 定义执行 SQL 语句 5 操作结果集对象
  • 100. Same Tree

    Definition for a binary tree node struct TreeNode int val TreeNode left TreeNode right TreeNode int x val x left NULL ri
  • 【Java】SpringBoot使用AOP进行日志解析打印+系统异常全局处理配置

    文章目录 前言 一 导入Lombok 二 创建日志打印Model 三 创建日志切面工具类 四 需要用到的一些常量类 五 创建接口请求切面 六 系统异常全局配置 总结 前言 为了方便项目部署在服务器之后 当出现BUG以及某些特殊需求时 会因为
  • Docker 笔记(全)

    1 关于Docker 1 1 概念 Docker 是一个开源的应用容器引擎 基于Go 语言 并遵从 Apache2 0 协议开源 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级 可移植的容器中 然后发布到任何流行的 Linu
  • 运算符之算术运算符、关系运算符、逻辑运算符、复合赋值运算符、其他运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号 C 有丰富的内置运算符 分类如下 算术运算符 关系运算符 逻辑运算符 复合赋值运算符 位运算符 其他运算符 运算符优先级 由高到低 类别 运算符 结合性 后缀 gt 从左到右 一元 ty
  • python学得好 监狱进的早_蟒周刊-403-监狱中学 Python 改变人生

    200115 Zoom Quiet 大妈 用时 42 分钟 完成快译 200115 Zoom Quiet 大妈 用时 17 分钟 完成格式转抄 Ned was getting reports for a mysterious disk I
  • 铨顺宏RFID:应用超高频RFID技术智能档案管理系统

    根据超高频率RFID技术性智能化档案智能管理系统将改变这一现况 根据选用先 进的超高频率RFID自动检索技术应用和计算机系统技术性 以超高频率RFIDrfid标签做为信息储存媒体并黏贴在档案袋上 在超高频率RFID集成ic中储存该档案的基本
  • 看完这篇 教你玩转渗透测试靶机vulnhub——FunBox2(ROOKIE)

    Vulnhub靶机FunBox2 ROOKIE 渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 FTP匿名访问 暴力破解 SSH私钥登入获取Shell Sudo提权
  • YOLO V4论文解读

    YOLO V4论文解读 一 YOLOV3回顾 二 YOLOV4中 三 Bag of freebies 数据扩充 模拟对象遮挡 结合多幅图像进行数据扩充 解决类别不平衡 label smoothing bbox Yolov4 use 四 Ba
  • java 字符串示例

    概述 最近项目上 需求 需要Android端在一段字符串分包处理 在此做个笔录 1 code public class Main public static void main String args System out println
  • mysql 1786_mysql错误:Statement violates GTID consistency

    在MYSQL中 执行建表语句时CREATE TABLE aaaa AS SELECT FROM menu 报 错误代码 1786 Statement violates GTID consistency CREATE TABLE SELECT
  • 训练loss不下降的原因总结

    表现 训练过程中loss值一直震荡 没有下降趋势 原因一 梯度消失 多因为网络深度过深 接近输入层的参数 梯度过小 解决方法 调整网络 激活函数relu batch normal 残差网络等 原因二 训练数据分布不均匀 这种情况对训练数据s
  • 力扣:350.两个数组的交集 II

    力扣 350 两个数组的交集 II 题目 给你两个整数数组 nums1 和 nums2 请你以数组形式返回两数组的交集 返回结果中每个元素出现的次数 应与元素在两个数组中都出现的次数一致 如果出现次数不一致 则考虑取较小值 可以不考虑输出结
  • 大数据课程I3——Kafka的消息流与索引机制

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 掌握Kafka的消息流处理 掌握Kafka的索引机制 掌握Kafka的消息系统语义 一 Kafka消息流处理 1 Producer 写入消息 流程说明 1 p
  • yolov5转tensorrt c++

    目录 yolo tensorrt 下载weights模型 onnx tensorrt project 编译问题解决 依赖项 自己生成weights模型 以及加载报错解决 生成引擎报错解决 批量预测 自动创建引擎 解决检测框乱的问题 提速 b
  • 对接微信米大师虚拟支付2.0文档

    话不多说 上代码 支付密钥算法 public static String calcPaySig String uri String postBody String appKey String needSignMsg uri postBody