微信支付(小程序)-java

news2024/12/27 21:58:53

 

 

微信支付开发者文档微信支付是腾讯公司的支付业务品牌,微信支付提供公众号支付、APP支付、扫码支付、刷卡支付等支付方式。微信支付结合微信公众账号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,微信支付支持微信红包和微信理财通,是移动支付的首选。https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/index.shtml

 https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=1_1

微信支付我们来探讨一下 和大家~ (说句实话 微信的官网真的是垃圾乱七八糟的 个人观点 如有雷同 纯属巧合)

 微信的各类说明 文档不够简洁明了 给我的感觉 很乱就 这一点估计也是这个产品团队的人员问题


微信支付 现在有2个版本 一个是v2  v3  ,v3比较新

微信没有沙箱环境,需要是企业。

首先商户平台 开通微信支付

微信支付-开发者文档https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml

 商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按Native、JSAPI、APP等不同场景生成交易串调起支付。

参数名变量类型[长度限制]必填描述
应用IDappidstring[1,32]body 由微信生成的应用ID,全局唯一。请求基础下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的服务号APPID
示例值:wxd678efh567hg6787
直连商户号mchidstring[1,32]body 直连商户的商户号,由微信支付生成并下发。
示例值:1230000109
商品描述descriptionstring[1,127]body 商品描述
示例值:Image形象店-深圳腾大-QQ公仔
商户订单号out_trade_nostring[6,32]body 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
示例值:1217752501201407033233368018
交易结束时间time_expirestring[1,64]body 订单失效时间,遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
示例值:2018-06-08T10:34:56+08:00
附加数据attachstring[1,128]body 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。
示例值:自定义数据  
通知地址notify_urlstring[1,256]body异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http
示例值:https://www.weixin.qq.com/wxpay/pay.php
订单优惠标记goods_tagstring[1,32]body 订单优惠标记
示例值:WXG
电子发票入口开放标识support_fapiaobooleanbody 传入true时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效。
true:是
false:否
示例值:true
-订单金额amountobjectbody 订单金额信息
参数名变量类型[长度限制]必填描述
总金额totalint订单总金额,单位为分。
示例值:100
货币类型currencystring[1,16]CNY:人民币,境内商户号仅支持人民币。
示例值:CNY
-支付者payerobjectbody 支付者信息
参数名变量类型[长度限制]必填描述
用户标识openidstring[1,128]用户在直连商户appid下的唯一标识。 下单前需获取到用户的Openid,Openid获取详见
示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
-优惠功能detailobjectbody 优惠功能
参数名变量类型[长度限制]必填描述
订单原价cost_priceint1、商户侧一张小票订单可能被分多次支付,订单原价用于记录整张小票的交易金额。
2、当订单原价与支付金额不相等,则不享受优惠。
3、该字段主要用于防止同一张小票分多次支付,以享受多次优惠的情况,正常支付订单不必上传此参数。
示例值:608800
商品小票IDinvoice_idstring[1,32]商家小票ID
示例值:微信123
+单品列表goods_detailarray单品列表信息
条目个数限制:【1,6000】
-场景信息scene_infoobjectbody 支付场景描述
参数名变量类型[长度限制]必填描述
用户终端IPpayer_client_ipstring[1,45]用户的客户端IP,支持IPv4和IPv6两种格式的IP地址。
示例值:14.23.150.211
商户端设备号device_idstring[1,32]商户端设备号(门店号或收银设备ID)。
示例值:013467007045764
+商户门店信息store_infoobject商户门店信息
-结算信息settle_infoobjectbody 结算信息
参数名变量类型[长度限制]必填描述
是否指定分账profit_sharingboolean是否指定分账
示例值:false

请求示例

 { "mchid": "1900006XXX", "out_trade_no": "1217752501201407033233368318", "appid": "wxdace645e0bc2cXXX", "description": "Image形象店-深圳腾大-QQ公仔", "notify_url": "https://www.weixin.qq.com/wxpay/pay.php", "amount": { "total": 1, "currency": "CNY" }, "payer": { "openid": "o4GgauInH_RCEdvrrNGrntXDuXXX" } }

返回参数

参数名变量类型[长度限制]必填描述
预支付交易会话标识prepay_idstring[1,64]预支付交易会话标识。用于后续接口调用中使用,该值有效期为2小时
示例值:wx201410272009395522657a690389285100

{ "prepay_id": "wx26112221580621e9b071c00d9e093b0000" }

错误码公共错误码

状态码错误码描述解决方案
403TRADE_ERROR交易错误因业务原因交易失败,请查看接口返回的详细信息
500SYSTEM_ERROR系统错误系统异常,请用相同参数重新调用
401SIGN_ERROR签名错误请检查签名参数和方法是否都符合签名算法要求
403RULE_LIMIT业务规则限制因业务规则限制请求频率,请查看接口返回的详细信息
400PARAM_ERROR参数错误请根据接口返回的详细信息检查请求参数
403OUT_TRADE_NO_USED商户订单号重复请核实商户订单号是否重复提交
404ORDER_NOT_EXIST订单不存在请检查订单是否发起过交易
400ORDER_CLOSED订单已关闭当前订单已关闭,请重新下单
500OPENID_MISMATCHopenid和appid不匹配请确认openid和appid是否匹配
403NO_AUTH商户无权限请商户前往申请此接口相关权限
400MCH_NOT_EXISTS商户号不存在请检查商户号是否正确
500INVALID_TRANSACTIONID订单号非法请检查微信支付订单号是否正确
400INVALID_REQUEST无效请求请根据接口返回的详细信息检查
429FREQUENCY_LIMITED频率超限请降低请求接口频率
500BANK_ERROR银行系统异常银行系统异常,请用相同参数重新调用
400APPID_MCHID_NOT_MATCHappid和mch_id不匹配请确认appid和mch_id是否匹配
403ACCOUNT_ERROR账号异常用户账号异常,无需更多操作


微信支付现在分为v2版和v3版
2014年9月10号之前申请的为v2版(旧版本),之后申请的为v3版。

V2版中的参数有

AppID

AppSecret

支付专用签名串PaySignKey

商户号PartnerID

初始密钥PartnerKey

并且包含一个证书文件: 安全证书

V3版中的参数有

AppID

AppSecret

商户号PartnerID

初始密钥PartnerKey

商户号MCHID

申请编号

商户平台登录帐号

商户平台登录密码

包含5个证书文件(证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书, 安全证书)

如果收到的邮件中没有【支付专用签名串PaySignKey】,表示已经是V3版的微信支付了。

微信支付
微信支付接口的入口也和微信公众平台的产品(公众号、小程序、企业微信)一样,都是统一在微信开放平台的资源中心中,我们其实只需要访问微信开放平台这一个官网,通过资源中心,即可访问到我们所需要对接的所有微信产品的接口文档。
 


 我们需要申请很多证书

获取预支付单号 支付 回调  



@RestController
@Api(tags = "PayController")
@Tag(name = "PayController", description = "微信支付")
@RequestMapping("/v3")
public class PayController {

    @PostMapping("/")
    public Map createOrder(Long amount, String desc,String openId) throws Exception{
        return PayUtil.createOrder(desc,amount,openId);
    }

    @PostMapping("/")
    public Map callBackOrder(HttpServletRequest request) throws Exception{
        System.out.println("微信回调开始返回");
        System.out.println("Wechatpay-Timestamp:"+request.getHeader("Wechatpay-Timestamp"));
        System.out.println("Wechatpay-Nonce:" + request.getHeader("Wechatpay-Nonce"));
        System.out.println("Wechatpay-Signature:" + request.getHeader("Wechatpay-Signature"));
        System.out.println("Wechatpay-Serial:" + request.getHeader("Wechatpay-Serial"));
        Map result = new HashMap();
        result.put("code","FAIL");
        try {
            StringBuilder signStr = new StringBuilder();
            // 请求时间戳\n
            signStr.append(request.getHeader("Wechatpay-Timestamp")).append("\n");
            // 请求随机串\n
            signStr.append(request.getHeader("Wechatpay-Nonce")).append("\n");
            BufferedReader br = request.getReader();
            String str =null;
            StringBuilder builder =new StringBuilder();
            while((str = br.readLine()) !=null){
                builder.append(str);
            }
            System.out.println(builder);
            signStr.append(builder.toString()).append("\n");
            //验证签名
            if(!PayUtil.signVerify(request.getHeader("Wechatpay-Serial"), signStr.toString(), request.getHeader("Wechatpay-Signature"))){
                result.put("message","sign error");
                return result;
            }
            //解密密文
            String decryptOrder = PayUtil.decryptOrder(builder.toString());
            System.out.println(decryptOrder);

            //验证订单
            result.put("message",decryptOrder);
            result.put("code","SUCCESS");
        }catch (IIOException e){
            e.printStackTrace();
        }
        return result;

    }


  
    @PostMapping("/")
    public Map<String, Object> wxPayNotify(HttpServletRequest request) {
        System.out.println("微信回调开始返回");
        System.out.println("Wechatpay-Timestamp:"+request.getHeader("Wechatpay-Timestamp"));
        System.out.println("Wechatpay-Nonce:" + request.getHeader("Wechatpay-Nonce"));
        System.out.println("Wechatpay-Signature:" + request.getHeader("Wechatpay-Signature"));
        System.out.println("Wechatpay-Serial:" + request.getHeader("Wechatpay-Serial"));
        Map result = new HashMap();
        result.put("code", "FAIL");
        BufferedReader reader = null;
        try {
            StringBuilder signStr = new StringBuilder();
            // 请求时间戳\n
            signStr.append(request.getHeader("Wechatpay-Timestamp")).append("\n");
            // 请求随机串\n
            signStr.append(request.getHeader("Wechatpay-Nonce")).append("\n");
            // 请求报文主体\n
            reader = request.getReader();
            String str = null;
            StringBuilder builder = new StringBuilder();
            while ((str = reader.readLine()) != null) {
                builder.append(str);
            }
            System.out.println(builder);
            signStr.append(builder.toString()).append("\n");
            // 1.验签
            if (!V3WXPayUtil.signVerify(request.getHeader("Wechatpay-Serial"), signStr.toString(), request.getHeader("Wechatpay-Signature"))) {
                result.put("message", "sign error");
                return result;
            }
            // 2.解密
            String decryptOrder = V3WXPayUtil.decryptOrder(builder.toString());
            System.out.println(decryptOrder);
            if (StringUtils.isEmpty(decryptOrder)) {
                result.put("message", "verification error");
                return result;
            } else {
                result.put("code", decryptOrder);
            }
            return result;
        } catch (IOException e) {
            e.printStackTrace();
            result.put("code", "FAIL");
            result.put("message", e.getMessage());
            return result;
        }
    }

}

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

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

相关文章

访问github网络问题解决

查看wsl可用镜像列表时产生如下访问github的网络问题 C:\Users\jiangcheng> wsl --list --online 无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法与服务器建立连接 Error code: Wsl/WININET_…

hive任务reduce步骤卡在99%原因及解决

我们在写sql的时候经常发现读取数据不多&#xff0c;但是代码运行时间异常长的情况&#xff0c;这通常是发生了数据倾斜现象。数据倾斜现象本质上是因为数据中的key分布不均匀&#xff0c;大量的数据集中到了一台或者几台机器上计算&#xff0c;这些数据的计算速度远远低于平均…

Vulkan Tutorial 9 模型加载Mipmaps

目录 28 加载模型 Sample mesh 加载顶点和索引 ​编辑 顶点去重 28 加载模型 我们将使用tinyobjloader库来从OBJ文件中加载顶点和面。它的速度很快&#xff0c;而且很容易集成&#xff0c;因为它是一个像stb_image一样的单文件库。将包含tiny_obj_loader.h的目录添加到Add…

ChatGPT国内镜像站

免费国内镜像推荐&#xff08;超稳定&#xff09; 下面为大家收集了目前国内最稳定流畅的ChatGPT镜像网站 目录 机器人 博弈ai 泰cool辣 道合顺 二狗问答 核桃 WOChat GPT中文站 TomChat 利用ChatGPTMindShow三分钟生成PPT ChatGPT国内镜像是啥 ChatGPT 镜像是指…

Xpdf 阅读器源码编译后查看文件中文乱码问题解决

经查阅&#xff0c;是由于缺少中文字体包&#xff1a; 第一步&#xff1a;下载所需要的字体包 下载https://dl.xpdfreader.com/xpdf-t1fonts.tar.gz 包含下载中文字体包&#xff08;非嵌入字体&#xff09; http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/gkai00mp…

pytorch-简单回归问题-手写数字识别

pytorch-简单回归问题-手写数字识别 线性回归添加噪声简单例子分类问题引入-手写数字识别数据集 训练推导手写数字识别1加载数据集编写网络训练网络计算正确率 线性回归添加噪声 使用均方差损失函数来衡量损失 简单例子 通过最小化损失函数&#xff0c;求解出参数w b 下图表示…

封装的函数停发/启动CAN报文,以及报文接收检测,高可用

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 📘前言 🍅 在测试过程中,我们可能需要可控的停/发某些报文,今天博主给…

chatgpt赋能python:Python主页面的SEO分析及优化建议

Python主页面的SEO分析及优化建议 Python是一种高级编程语言&#xff0c;广泛应用于人工智能、数据分析、Web开发等领域。Python官方网站是Python社区的一个重要门户&#xff0c;为全球学习Python的开发者提供了全面、权威、可靠的信息。在这篇文章中&#xff0c;我们将分析Py…

Text to image论文精读SeedSelect: 使用SeedSelect微调扩散模型It’s all about where you start

随着文本到图像扩散模型的发展&#xff0c;很多模型已经可以合成各种新的概念和场景。然而&#xff0c;它们仍然难以生成结构化、不常见的概念、组合图像。今年4月巴伊兰大学和OriginAI发表《It’s all about where you start: Text-to-image generation with seed selection》…

软件外包开发项目原型图工具

项目原型图工具有非常重要的作用&#xff0c;尤其是在APP项目开发中&#xff0c;对于整体需求的表达是必不可少的工具。相比于传统的文档需求&#xff0c;图形文字的表达可以更清楚的表达需求&#xff0c;让客户清楚的明白软件功能有哪些&#xff0c;最后的界面是怎样的&#x…

微信海量数据查询如何从1000ms降到100ms?

&#x1f449;腾小云导读 微信的多维指标监控平台&#xff0c;具备自定义维度、指标的监控能力&#xff0c;主要服务于用户自定义监控。作为框架级监控的补充&#xff0c;它承载着聚合前 45亿/min、4万亿/天的数据量。当前&#xff0c;针对数据层的查询请求也达到了峰值 40万/m…

RL - 强化学习 上置信界算法 (UCB) 和 汤普森采样算法 (TS)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130983835 上置信界算法和汤普森采样算法是两种解决多臂老虎机问题的经典方法。多臂老虎机问题是一种探索与利用的平衡问题&#xff0c;…

Java easypoi 导出excel 并合并相关列

在项目开发中经常会使用到合并列&#xff0c;格式如下&#xff1a; 1.引入easypoi <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId></dependency><dependency><groupId>cn.aftertur…

设计模式详解之策略模式

作者&#xff1a;刘文慧 策略模式是一种应用广泛的行为型模式&#xff0c;核心思想是对算法进行封装&#xff0c;委派给不同对象来管理&#xff0c;本文将着眼于策略模式进行分享。 一、概述 我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#x…

chatgpt赋能python:Python什么情况下用类

Python什么情况下用类 在Python编程中&#xff0c;类是一种重要的数据结构&#xff0c;它是面向对象编程的核心。类可定义数据类型&#xff0c;并把数据与操作数据的函数组合在一起。因此&#xff0c;通过使用类&#xff0c;我们可以将数据、函数和其他方法组合在一起&#xf…

OLAP系列:四、clickhouse分布式表使用指南

一、背景 ClickHouse中最强大的表引擎当属MergeTree&#xff08;合并树&#xff09;引擎及该系列&#xff08;*MergeTree&#xff09;中的其他引擎&#xff0c;支持索引和分区&#xff0c;地位可以相当于innodb之于Mysql。 而且基于MergeTree&#xff0c;还衍生出了很多小弟&a…

【量化分析】绘制指标线EWM和MACD(1)

目录 一、说明 二、使用mplfinance的前提 2.1 mplfinance生态圈 2.1 安装mplfinance 三、mplfinance绘图 3.1 单变量图 3.2 将用户自己生成的曲线添加到 mplfinance plot() 四、显示EWM和MACD 一、说明 在做量化分析的时候&#xff0c;需要有能力计算种种曲线&#xff…

ShowMeBug 持续升级,提供高信效度支撑的技术招聘方案

去年年底&#xff0c;全新升级版的 ShowMeBug ——一款支持实战编程的技术能力评估平台&#xff0c;首次揭开了它神秘的面纱。 而近日&#xff0c;ShowMeBug 再次迎来一系列产品更新&#xff0c;它将以全新的面貌&#xff0c;提供高信效度支撑的技术招聘方案&#xff0c;持续助…

chatgpt赋能python:Python人脸登录:这项技术将颠覆传统的登录方式

Python人脸登录&#xff1a;这项技术将颠覆传统的登录方式 简介 在互联网时代&#xff0c;登录是每个人使用网站或软件的第一步&#xff0c;但是传统的用户名和密码登录已经不能满足用户的需求。不断的爆出各种账户泄露事件、密码猜测和密码被盗等问题&#xff0c;导致用户的…

cleanmymac要不要下载装机?好不好用

当我们收到一台崭新的mac电脑&#xff0c;第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”&#xff0c;监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…