微信公众号支付开发流程与避坑手册-Java篇

病理图像处理个人手札(三)WSI & MIL 1.什么是WSI? WSI全称是Whole Slide Image,也就是全视野数字切片,主要应用在病理学细胞图像领域。WSI 是利用数字扫描仪对传统的病理切片进行扫描,采集具有高分辨率的数字图像,再通过计算机将得到的碎片化图像进行无缝拼接整合,制作可视化数字图像的一项技术。与传统载玻片相比,很好地解决了传统的玻璃切片易损坏、易褪色、易丢片、检索困难的问题。 一言以蔽之,WSI是对传统载玻片进行数字化。 由于是全视野,因此它将包含多尺度的切片在一个文件上面。因此WSI将使用到金字塔模型满足其支持不同分辨率的 阅读详情
前言

最近完成了微信公众号内的支付功能,在开发的过程中遇到了各种各样的问题,在这里,我把开发的过程分享出来,给大家做个参考。

首先,在准备开发的时候需要进行必要的配置。

1.登录微信商户平台,在产品中心->开发配置中对支付授权目录进行配置
(注意:支付授权目录的配置规则是你使用微信支付控件页面的上一级目录,比如:你在www.xxx.cpm/wx/pay/pay.html中调用微信支付控件,那么你需要配置的目录是www.xxx.cpm/wx/pay/)
这里写图片描述

2.在账户中心->API安全中配置key值,此参数在生成签名时需要用到。
这里写图片描述

3.其他参数与配置:appid,开发者密码以及网页授权
这里写图片描述

在做完这些配置以后,我们就可以进行微信支付的开发了。在这里推荐参考微信平台提供的demo。https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

按照文档中统一接口的实现流程,我们需要先实现发起微信支付的请求。这里的请求链接是统一下单的链接,POST请求

  /**
     * 发起微信支付请求 
     * @param requestUrl  请求链接
     * @param method  请求方式
     * @param param  请求参数
     * @param connectTimeOut  连接超时时间
     * @param readTimeOut  读取超时时间
     * @return 请求结果
     */
public String requestOnce(final String requestUrl, final String method, String param, boolean useCert, int connectTimeOut, int readTimeOut) {
        HttpURLConnection conn = null;
        StringBuilder builder = new StringBuilder();
        try {
            URL url = new URL(requestUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod(method);
            conn.setConnectTimeout(connectTimeOut);
            conn.setReadTimeout(readTimeOut);
            OutputStream out = conn.getOutputStream();
            out.write(param.getBytes());
            out.flush();
            out.close();
            int responseCode = conn.getResponseCode();
            if (responseCode == 200) {
                InputStream inputStream = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
                reader.close();
                inputStream.close();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }

在这里我们将微信支付所需要的参数进行填充。

 /**
     * 填充微信支付参数
     * @param data 需要填充的Hashmap
     * @return 参数
     */
    public Map<String, String>  fillRequestData(Map<String, String> data) throws Exception {
        data.put("appid", config.getAPPID());
        data.put("mch_id", config.getMCHID());
        data.put("nonce_str", WXPayUtil.generateNonceStr());
        data.put("notify_url",config.getNOTIFY_URL());
        data.put("spbill_create_ip", config.getSERVER_IP());
        data.put("trade_type", config.getJSAPI());
        if (WXPayConstants.SignType.MD5.equals(this.signType)) {
            data.put("sign_type", WXPayConstants.MD5);
        }
        else if (WXPayConstants.SignType.HMACSHA256.equals(this.signType)) {
            data.put("sign_type", WXPayConstants.HMACSHA256);
        }
        data.put("sign", WXPayUtil.generateSignature(data, config.getKEY(), this.signType));
        return data;
    }

在请求成功之后,微信服务器会返回xml形式的参数,我们可以将xml转换为Map(此方法在微信demo中有实现)。此外在结果返回成功以后,需要再次生成签名,此签名是由于前端页面调起微信支付控件所用。

 /**
     * 发起微信支付认证请求
     * @param requestUrl 请求链接
     * @param method 请求方式
     * @param param 请求参数
     * @param useCert 是否使用证书
     * @return 认证结果
     */
    private Map<String, String> request(final String requestUrl, final String method, String param, boolean useCert) {
        String strXml = wxPayRequest.request(requestUrl, method, param, useCert, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
        Map<String, String> data;
        try {
            data = WXPayUtil.xmlToMap(strXml);
        } catch (Exception e) {
            data = null;
            e.printStackTrace();
        }
        return data;
    }

private Map<String, String> returnAuthParam(Map<String, String> temp, String key) {
        Map<String, String> result = new HashMap<String, String>();
        long timestamp = System.currentTimeMillis() / 1000;
        result.put("appId", temp.get("appid"));
        result.put("timeStamp", String.valueOf(timestamp));
        result.put("nonceStr", temp.get("nonce_str"));
        result.put("package", "prepay_id=" + temp.get("prepay_id"));
        result.put("signType", WXPayConstants.MD5);
        String sign = null;
        try {
            sign = WXPayUtil.generateSignature(result, key, WXPayConstants.SignType.MD5);
        } catch (Exception e) {
            e.printStackTrace();
        }
        result.put("paySign", sign);
        result.put("return_code", temp.get("return_code"));
        result.put("result_code", temp.get("result_code"));
        return result;
    }

签名生成方法:

/**
     * 生成签名 MD5 HMACSHA256
     * @param data 参数
     * @param key API密钥
     * @param signType 签名方式
     * @return 签名
     */
    public static String generateSignature(final Map<String,String> data, String key, WXPayConstants.SignType signType) throws Exception {
        Set<String> keySet = data.keySet();
        String[] keyArray = keySet.toArray(new String[keySet.size()]);
        Arrays.sort(keyArray);
        StringBuilder sb = new StringBuilder();
        for (String k : keyArray) {
            if (k.equals(WXPayConstants.FIELD_SIGN)) {
                continue;
            }
            if (data.get(k).trim().length() > 0) {
                sb.append(k).append("=").append(data.get(k).trim()).append("&");
            }
        }
        sb.append("key=").append(key);
        if (WXPayConstants.SignType.MD5 == signType) {
            return MD5(sb.toString()).toUpperCase();
        }
        throw new Exception(String.format("Invalid sign_type: %s", signType));
    }

在做完这些操作以后,就可以在前端实现调起微信支付控件的逻辑了。在微信支付文档中给出了一种写法:

if (typeof WeixinJSBridge == "undefined"){
                       if( document.addEventListener ){
                           document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
                       }else if (document.attachEvent){
                           document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
                           document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
                       }
                    }else{
                       onBridgeReady(data);
                    }
function onBridgeReady(data){
    orderPage.orderParam.orderId = data.orderId;
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest', {
        "appId": data.appId,     //公众号名称,由商户传入      
        "timeStamp": data.timeStamp, //时间戳,自1970年以来的秒数
        "nonceStr": data.nonceStr, //随机串     
        "package": data.package,     
        "signType": data.signType,         //微信签名方式:     
        "paySign": data.paySign //微信签名 
        },
        function(res){
            alert(res.err_msg + " " + res.err_code + " " + res.err_desc);
            if(res.err_msg == "get_brand_wcpay_request:ok"){
                orderPage.orderParam.status = "WAITSEND";
                orderPage.submitOrder();
            }else if(res.err_msg == "get_brand_wcpay_request:fail"){
                alert("调用微信支付失败");
            }else if(res.err_msg == "get_brand_wcpay_request:cancel"){
                alert("已取消支付");
            }
        }
    ); 
}

在上面所使用到的参数都是服务端微信支付请求成功后获取的参数。完成这些之后,微信支付就可以使用了。
但是我们开发的过程中,如果没有相关的项目经验,难免会遇到很多坑。这里我就列举出我在开发中遇到的问题。

  1. 参数缺失:缺少openid,在微信公众号内嵌网页中调用微信支付需要添加用户的openid。
  2. 参数形式错误:在前端调起微信支付控件时,将package参数传错,package参数的正确格式为:“prepay_id=XXXXXXXXX”,而我忘了加入“prepay_id=”,这个错误着实让我找了好久(都是不仔细阅读文档的问题)。
  3. 签名失败:这个签名失败是在前端提示。造成的原因是我在微信支付请求成功之后,直接使用了服务端申请微信支付请求生成的签名,而正确的应该是在申请支付权限成功之后,需要**将前端用到的参数拿过来重新生成一次签名才对。**这个错误卡了我大半天才搞定,需要注意。
  4. get_wcpay_branch_request:fail,这个错误的排查顺序是:首先查看返回参数中request_code,result_code的返回值,如果都为SUCCESS,那么说明服务端请求微信支付权限已经成功,错误就来自于前端,或者参数错误(参考3)。

微信支付的调试:
由于开发微信支付需要调用第三方接口,所以在调试的时候会遇到诸多不便。这里我们就需要使用一些工具来帮助我们完成。
1.微信web开发者工具,我们可以使用这个工具进行调试,直接输入链接地址,然后在这里可以断点调试也可以查看相关错误信息。
这里写图片描述
2。打印log。在前端我们可以打印出关键信息进行错误排查。比如说,在调用微信支付控件时,输出err_msg,err_code,err_desc,进行查看。
这里写图片描述

最后说两句

在做完微信支付以后,其实你会发现并没有太大难度,就是在开发的过程中我们需要善于发现问题。还有就是要仔细阅读文档,我遇到的一些错误有很多都是文档中所提到的,但是没有仔细看所以就花费了很多时间去排查错误,而这些都是可以避免的。

最后一张,微信支付的目录结构(仅供参考):
这里写图片描述

Gephi新手必看:如何用Excel整理CSV数据快速生成网络图(附模板) 本文为Gephi新手提供了一份从Excel数据整理到生成专业网络图的完整指南。详细讲解了如何构建规范的节点表和边表CSV文件,并导入Gephi进行可视化分析。通过实战案例,帮助读者快速掌握利用Excel整理数据、规避常见错误,并运用布局算法与视觉编码,将复杂关系数据转化为直观的网络洞察。 阅读详情

相关推荐

多 Agent 之间如何通信和协调?OpenClaw 的 Gateway 在其中扮演什么角色?

多 Agent 之间如何通信和协调?OpenClaw 的 Gateway 在其中扮演什么角色?

我哎GIS博客 1665

微信支付 总提示get_brand_wcpay_request:fail 也不跳转支付页面 的解决方案

28行是我后面加进去的,主要用来查看返回的详细信息,信息提示我是我当前域名没有在微信支付配置中授权,登录微信公众号平台,在微信支付中配置下授权目录,在这里,将提示信息中的目录添加到该目录下,过几分钟就OK了.。

coldriversnow的专栏 1689

virtuoso:layout如何做flat修drc

有些drc在virtuoso layout中修更节省时间,比如遇到一些via array需要做删改时,发现工具把via array做成了一个cell,如图。去改cell可能会影响很多via,所以最好的办法是做flat,去调整cut,比如删除。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 342

微信公众号支付开发(一):前期准备

微信公众号(服务号)认证准备工作

Desire染指年华 650

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2566

《网络安全自学教程》- 802.1x协议

802.1x协议架构,工作原理/认证流程,认证方式,MAB认证,触发认证的三种方式,EAP报文格式,EAPOL报文格式

wangyuxiang946的博客 2万+

微信服务号开发-整合微信支付

最近的项目在对接微信支付,所以抽出一些时间,将方法总结一下:欢迎加群交流:724225958官方开发文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=1_1;文档中分别对支付账户(参数)、接口规则、支付业务场景,流程、API做了详细介绍,并提供了SDK以及DEMO ,大部分有一定基础的开发或研发,均可参照文档及其demo,一步一...

Soongp的博客 3530

【47】软考软件设计师——全真模拟卷(下午题)|5道案例分析+答题模板+评分标准

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第47篇,属于**模块六:冲刺与模拟**第四篇,严格遵循软考下午题真题规范(5道案例分析题,150分钟,满分75分,45分及格),覆盖数据流图(DFD)、E-R图与关系模式、UML类图与用例图、算法设计与代码填空、设计模式应用五大核心题型。全文采用“真题级案例+分步答题模板+采分点明细+评分标准”的形式,每道题配套“审题技巧→解题步骤→规范作答模板→常见错误扣分点”,深度拆解案例分析题的得分逻辑,帮助考生掌握“按点踩分、规范表述、避坑扣分”的核心能力

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 685

微信支付(一)统一下单接口注意事项

开发背景 WXPaySdk 3.0.9 Java 注意事项 使用SDK中的requestWithoutCert方法发送下单请求时传入的data是xml格式的,不是json格式。可以使用 WXPayUtil.mapToXml(jsonObject); 因为这个版本的WXPayConfig中的方法仅同包可以实现,所以我这里把它copy到工程中进行实现,在实现其getWXPayDomain方法时需要返回一个IWXPayDomain接口的实现类,注意实现getDomain方法时DomainInfo

Nio的博客 1307

优快云专栏限时活动!福利公告必读!

本人优快云付费专栏周排名27名专业博主,每周文章平均阅读量约7w以上!

FJN110的博客 3153

【论文汇总】Diffusion Models视频生成/视频编辑/可控视频生成/跨模态视频生成

本文总结了Diffusion Models视频生成领域相关的工作,目前共收录142篇,持续更新中。

沉迷单车的追风少年 1672

微信支付

微信支付目录 文章目录微信支付目录前言一、微信支付简介支付场景支付的流程基本流程二、使用步骤1.引入库2.下载完成之后总结 前言 随着科技的进步,越来越多的人开始使用移动支付作为支付手段,所有掌握主流的移动支付也变得很重要了 一、微信支付 简介 再很多场合大家用的都是微信支付,它方便了大家,改善了人们的生活。 支付场景 支付的流程 基本流程 在微信公众平台获取商户号 在微信商户平台关联商户 二、使用步骤 1.引入库 到官网选取合适的sdk下载,很多东西官方都给你写好了,地址在下边 2.

qq_44688861的博客 368

小梅哥Xilinx FPGA学习笔记11——亚稳态

亚稳态就是D触发器输入信号在其数据窗口期内发生变化,导致D触发器的输出进入一段时间的不稳定状态,有可能发生振荡,并最终随机稳定在高电平或者低电平。

m0_51430584的博客 631

阿里正式发布《Java开发手册》终极版!

点击上方“终端研发部”,选择“星标”回复“资源”,领取全网最火的Java核心知识总结~前言别人都说我们是码农,但我们知道,自己是个艺术家。也许我们不过多在意自己的外表和穿着,但我们不羁的...

这个时代,作为程序员可能要学习小程序 1418

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Oracle 官方定调:JVM 未来 3 大趋势(附可运行代码 + 落地时间表 + 避坑手册)

结合 10 余年 Java 底层实战经验与 Oracle《JVM 技术路线白皮书(2024-2027)》,拆解 JVM 三大未来趋势:2025 年 WASM 跨语言(附 Java 调用 Rust 可运行代码,延迟降 60%)、JDK 23 云原生动态内存(K8s 配置示例,解决 OOM)、2026 年 JDK 24 内置安全审计(对接 OpenTelemetry 代码,性能损耗<5%),所有技术点附 Oracle 官方链接、生产案例(电商 / 支付 / 银行)及避坑要点,读者可直接复用落地。

开源架构师的博客 1095

NTscan扫描工具

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

微信公众号支付的开发经历 2016年java版

最近做了微信公众号支付的开发,开发过程中使用官方的手册还是遇到了很多问题,在百度的过程中发现大家遇到的问题根本原因都类似,但是很杂乱,最终还是解决了。把自己遇到的一些经验记录下来,希望能够对大家有所帮助,之所以写2016年版,是因为网上的资料很多是旧的,大家都是相互复制粘贴。 前言:首先要说的一点:我看见有些人的页面里使用WeixinJSBridge,这个已经过时了,新开发的情况下不要用这个

774

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【软件开发规范篇】JAVA后端开发编程安全规范

现在的软件项目都是团队多人合作一起开发,软件架构的复杂性也需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。本文介绍一下JAVA后端开发,关于编程安全方面,可以遵循的一些技术规范。以上介绍了JAVA后端开发,关于编程安全方面,可以遵循的一些技术规范。编程安全无小事,若出现安全问题,被黑客恶意攻击,轻则出现服务器故障。

分享是一种境界,勤于分享,乐于分享! 1552

最全一个项目搞定支付宝,微信支付!(1),tomcat原理及作用

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

2301_82244514的博客 862

阿里巴巴开发手册“泰山”版它来了,1.4.0+终极版+阿里内部PPT

说明:对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且 操作列在多个表中存在时,就会抛异常。反例:在某业务中,由于多表关联查询语句没有加表的别名(或表名)的限制,正常运行两年后,最近在 某个表中增加一个同名字段,在预发布环境做数据库变更后,线上查询语句出现出 1052 异常:Column 'name' in field list is ambiguous。表达式 1 : 表达式 2 中,高度注意表达式 1 和 2 在类型对齐时,可能抛出因自动拆箱导致的 NPE 异常。

代码界的扛把子 1263

芋道 ruoyi-vue-pro v1.8.0 发布:重构支付中心,提供支付接入实战

以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。有任何问题,或者想要的功能,可以在Issues中提给艿艿。😜 给项目点点 Star 吧,这对我们真的很重要!

Jdjdjjdjdjdje的博客 2222

JAVA儿女相亲婚恋相亲交友一对一相亲系统源码支持微信公众号+H5+APP

中国适婚人群已突破2.4亿,传统婚介模式因信息不透明、匹配效率低饱受诟病。基于SpringBoot+UniApp全栈技术开发的JAVA儿女相亲婚恋系统源码,创新融合"爱心钥匙算法"与"合伙人裂变模式",实现微信公众号、H5、APP三端数据互通,为婚恋平台运营商提供全流程数字化解决方案,助力破解行业信任危机与盈利难题。

2401_89037213的博客 913

基于Springboot+vue前后端分离商城项目基本开发手册【一】

开发环境准备 项目目录结构 权限管理 通用分页表格 Swagger文档 undertow容器 对xss攻击的防御 分布式锁 统一的系统日志 统一验证 统一异常处理 文件上传下载 一对多、多对多分页 开发环境准备 mall的商业版,最基本的开发环境与开源版本一致,方便用户迁移,我们认为,购买商业版,并且需要进行代码编写的人员,都是具有一定技术基础的开发人员。 1.开...

huaishitou的专栏 2398
上一篇: IntelliJ IDEA导入Maven构建的Web工程
下一篇: git解决non-fast-forward冲突
Coding-ls
博客等级 码龄11年 41粉丝 61原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值