微信小程序调用微信支付功能

最近在开发微信小程序过程中,接入了微信支付功能。前后花了不少时间,今天终于发起一笔支付,并且支付成功。现在把微信支付的流程记录下来。

一、准备商户信息

这个需要开通微信支付商户信息,我这里是企业性质,所以按照要求提交营业执照,法人信息就可以申请下来。

商户申请之后,还需要关联小程序appid,登录商户信息,下载开发所需的证书。这里证书是p12格式,一般我们不用这个,需要使用证书apicient_cert.pem和私钥apiclient_key.pem。

还有商户号merchantId,证书序列号merchantSerialNumber。还有一个api-v3-key,这个是我们开发人员自己设置的一个32位字符串,我记着是在申请证书的时候,填入商户信息里面的。开发人员需要保存。另外我个人根据自己的情况,还需要一个公共证书(也是在商户管理页面下载)public_key.pem和一个公钥public-key-id字符串,在公钥页面也能看到,复制给开发人员即可。

二、开发配置

微信支付,主要还是后端开发,这里类似于微信小程序里面调起手机号的功能,前端无法直接发起请求,只能后端发起。

这里java后端的配置,主要有一个证书相关的配置。

引入sdk

<dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.2.17</version> </dependency>

支付配置类WxPayConfig

import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.RSAPublicKeyConfig; import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("wxpay.properties") @ConfigurationProperties(prefix = "v3") public class WxPayConfig { @Value("${v3.merchant-id}") private String merchantId; @Value("${v3.private-key-path}") private String privateKeyPath; @Value("${v3.public-key-id}") private String publicKeyId; @Value("${v3.public-key-path}") private String publicKeyPath; @Value("${v3.merchant-serial-number}") private String merchantSerialNumber; @Value("${v3.api-v3-key}") private String apiV3Key; @Value("${v3.notify-url}") private String notifyUrl; @Bean public Config wxCustomConfig() { return new RSAPublicKeyConfig.Builder() .merchantId(merchantId) .privateKeyFromPath(privateKeyPath) .publicKeyId(publicKeyId) .publicKeyFromPath(publicKeyPath) .merchantSerialNumber(merchantSerialNumber) .apiV3Key(apiV3Key) .build(); } @Bean public JsapiServiceExtension jsapiService() { return new JsapiServiceExtension.Builder().config(wxCustomConfig()).build(); } public String getMerchantId() { return merchantId; } public String getNotifyUrl() { return notifyUrl; } }

wxpay.properties

v3.merchant-id=1102598xxx v3.private-key-path=apiclient_key.pem v3.merchant-serial-number=40A59577488601B83F45C5BE5C45423633B8Dxxx v3.api-v3-key=7E4B94dd83acd6419918b81b7a2caxxx v3.public-key-id=PUB_KEY_ID_0111025983422026011400211558002xxx v3.public-key-path=pub_key.pem v3.notify-url=https://localhost/payment/notify

这个配置类里面,使用RSAAutoCertificateConfig配置的时候,报错。所以换了RSAPublicKeyConfig类。

其实,后端支付开发,主要是要根据前端交易信息来生成一个预支付订单,然后小程序拿到这个预支付订单返回的信息,调起微信支付,完成支付。小程序需要发起一个预支付请求。这个预支付请求里面需要携带商品信息,比如:商品描述,价格,还有一个谁支付的,也就是支付人的信息,这里参数叫openid。这个需要前端先发起一个通过wx.login()登录返回的code码调用后端代码获取这个openid请求,换取openid的接口:https://api.weixin.qq.com/sns/jscode2session。

预支付接口service层代码:

PayService.java

public interface PayService { void closeOrder(); Transaction queryOrderById(); Transaction queryOrderByOutTradeNo(); PrepayWithRequestPaymentResponse prepay(ProductVo productVo); void nonce(Map<String,Object> msg); }

PayServiceImpl.java主要代码

@Override public PrepayWithRequestPaymentResponse prepay(ProductVo productVo) { PrepayRequest request = new PrepayRequest(); // 必填字段 appid mchid description out_trade_no notify_url amount payer(openid) request.setAppid(appId); request.setMchid(wxPayConfig.getMerchantId()); request.setNotifyUrl(wxPayConfig.getNotifyUrl()); Amount amount = new Amount(); amount.setCurrency("CNY"); amount.setTotal((int) (productVo.getPrice()*100)); request.setAmount(amount); request.setDescription(productVo.getDescription()); request.setOutTradeNo(NumberUtil.generateOutTradeNo()); Payer payer = new Payer(); payer.setOpenid(productVo.getOpenID()); request.setPayer(payer); return jsapiService.prepayWithRequestPayment(request); }

调起支付所需的参数,官方示例给的是jsapiservice.prepay()。但是这个方法返回的是一个prepay_id=xxx的参数,我们在前端小程序调起支付的时候,它还需要这些参数:

wx.requestPayment({ "nonceStr":nonceStr, "package": packageVal, "paySign": paySign, "timeStamp": timeStamp, "signType": "RSA", "success": function(res) { console.log(res) }, "fail": function(err) { console.log("err",err) }, "complete": function(res){ console.log("complete",res) } })

这里packageVal的值,就是jsapiservice.prepay()返回的。其他的timeStamp,paySign,nonceStr几个参数还是需要我们自己来设置。那么就有了JsapiServiceExtension类,它内部引用了JsapiService类,也会调用它的prepay()方法,同时,还会包装其他几个参数,正好构成我们调起小程序的主要参数,signType我们自己填上,而且只能填写RSA。

我们可以看看JsapiServiceExtension.prepayWithRequestPayment()方法。

public PrepayWithRequestPaymentResponse prepayWithRequestPayment(PrepayRequest request) { String prepayId = this.jsapiService.prepay(request).getPrepayId(); long timestamp = Instant.now().getEpochSecond(); String nonceStr = NonceUtil.createNonce(32); String packageVal = "prepay_id=" + prepayId; String message = request.getAppid() + "\n" + timestamp + "\n" + nonceStr + "\n" + packageVal + "\n"; logger.debug("Message for RequestPayment signatures is[{}]", message); String sign = this.signer.sign(message).getSign(); PrepayWithRequestPaymentResponse response = new PrepayWithRequestPaymentResponse(); response.setAppId(request.getAppid()); response.setTimeStamp(String.valueOf(timestamp)); response.setNonceStr(nonceStr); response.setPackageVal(packageVal); response.setSignType(this.signType); response.setPaySign(sign); return response; }

这个方法是sdk推荐的方法。

预支付controller层代码

@RequestMapping("/payment") public class PaymentController { @Autowired private PayService payService; @ApiOperation("预支付") @PostMapping("/prepay") public ResultData prepay(@RequestBody ProductVo productVo) { PrepayWithRequestPaymentResponse response = payService.prepay(productVo); return ResultData.success(response); } @ApiOperation("通知") @PostMapping("/notify") public ResultData paymentNotify(@RequestBody Map<String,Object> msg) { // {id:"",create_time:"",resource_type:"",event_type:"",summary:"",resource:{}} payService.nonce(msg); return ResultData.success(); } }

以上就是java后端要作的相关工作,总结一下就是配置商户、证书相关信息。然后调用JsapiServiceExtension类的预支付接口,生成小程序调起支付功能的相关参数。微信小程序端支付成功之后,有一个回调地址,我们需要配置,然后根据支付回调更改订单支付状态。

三、前端开发

前端开发需要配合的就是

第一个需要获取支付人的信息也就是openid。这个可以通过wx.login()返回值code去后台接口换取: https://api.weixin.qq.com/sns/jscode2session。

第二个就是预支付,这里我们传入我们需要支付的商品主要信息:商品描述,商品价格,支付者openid。

第三个调起支付,这里小程序提供了wx.requestPayment()方法。这个方法需要传入五个必填参数:nonceStr,package,timeStamp,paySign,signType。

关于微信支付,主要配置在后端。前端只是通过接口调用。

我这里的需求是微信小程序调起支付,使用的是jsapi这种方式,很多例子里面会提到native这种方式,这种方式也是支付的一种方式,但是它是生成一个商户支付的二维码,然后用户扫码支付,类似于我们在街头买吃的,扫商家码付款。通过jsapi这种方式,我们是直接调起微信支付,少了扫码这个环节。

我在开发者工具里面写好代码,调试的时候,发现在调起支付这里,接口调用是没问题的,但是因为本地开发,无法调起微信支付,所以它弹出了一个二维码,让手机扫码支付。感觉这个功能又有点像native的方式,给你返回一个二维码,扫码支付。

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

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

相关文章

2026杭州代理记账服务流程哪家公司专业解析

在企业经营过程中,规范的代理记账服务流程对财务合规与高效管理至关重要。杭州作为经济活跃城市,代理记账服务需求旺盛,选择流程专业的服务机构成为企业关注的重点。一、推荐榜单推荐 1:鼎颜财税科技(杭州)有限公…

科学规划指南:基础差怎么备考主治医师实现稳步通关

科学规划指南:基础差怎么备考主治医师实现稳步通关随着我国医疗卫生事业的快速发展,主治医师职称考试作为医师职业发展的重要阶梯,其通过率直接关系到医疗人才队伍的专业化水平。然而,对于众多基础相对薄弱的临床医…

导师推荐!研究生必用8款AI论文工具测评:开题报告文献综述全攻略

导师推荐&#xff01;研究生必用8款AI论文工具测评&#xff1a;开题报告文献综述全攻略 学术写作新工具测评&#xff1a;2026年研究生必备AI论文工具榜单出炉 随着人工智能技术的不断进步&#xff0c;越来越多的学术研究者开始依赖AI工具提升论文写作效率。然而&#xff0c;面…

基于Python+Django的电信资费管理系统源码文档部署文档代码讲解等

课题介绍本课题针对电信行业资费套餐繁杂、计费核算低效、用户资费查询不便等痛点&#xff0c;设计并实现基于PythonDjango框架的电信资费管理系统&#xff0c;构建规范化、高效化的电信资费全流程管控平台。系统以MySQL为数据存储核心&#xff0c;结合HTML、CSS、JavaScript及…

2026年市场靠谱的泌尿科刨削动力代加工实地厂家哪家好,运动医学/电动骨动力/电动骨组织动力,刨削动力实地厂家排行

引言:泌尿科刨削动力市场的新格局与核心价值 随着微创医疗技术的快速发展,泌尿科手术对高精度、低创伤的动力设备需求持续增长。其中,刨削动力系统作为关节镜、内窥镜手术的核心组件,其稳定性、精准度和代加工能力…

2026车间用什么扫地车好?行业实用参考

在工业生产环境中,车间地面的清洁度不仅影响生产效率,更与作业安全、产品质量密切相关。选择合适的扫地设备能够有效降低人工成本、提升清洁效率,尤其对于存在金属碎屑、粉尘、油污等复杂污染物的车间场景,专业扫地…

基于Python+Django的多功能校园网站的设计与实现源码文档部署文档代码讲解等

课题介绍 本课题针对校园信息传递分散、师生互动不畅、校园服务碎片化等痛点&#xff0c;设计并实现基于PythonDjango框架的多功能校园网站&#xff0c;构建集信息发布、互动交流、服务办理于一体的综合性校园数字化平台。系统以MySQL为数据存储核心&#xff0c;结合HTML、CSS、…

深圳谷歌独立站代运营排名前十怎么选?昊客网络用技术 + 案例说话!

做外贸想靠谷歌独立站打开全球市场,却被五花八门的代运营机构绕晕?在深圳谷歌独立站优化推广代运营排名前十的机构里,昊客网络凭借近十年深耕、硬核技术和实打实的案例成果,成为众多中小企业的出海首选。今天就来拆…

2026市场知名的专利律所推荐及选择参考

知识产权是企业核心竞争力的重要组成部分,专利作为知识产权的核心载体,其申请、布局、维权等环节需要专业的法律服务支持。市场上知名的专利律所凭借深厚的专业积累和丰富的实践经验,为企业提供从专利挖掘到侵权应对…

AI技术如何重塑网络优化,从人力密集型转向技术驱动

随着企业数字化进程不断深入&#xff0c;网络可见性已然成为品牌竞争的具备关键意义的战场。传统的搜索引擎优化也就是SEO&#xff0c;以及地理位置优化也就是GEO的服务&#xff0c;高度依赖人工所拥有的经验以及重复性的操作&#xff0c;在效率方面&#xff0c;在规模方面&…

Golang中达成基于角色的访问控制(RBAC)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

大文件预览推荐前端直接应用Blob URL

大文件预览推荐前端直接应用Blob URLpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

小白前端速成:搞定CSS3段落与行样式,排版不再翻车(附避坑指

小白前端速成&#xff1a;搞定CSS3段落与行样式&#xff0c;排版不再翻车&#xff08;附避坑指小白前端速成&#xff1a;搞定CSS3段落与行样式&#xff0c;排版不再翻车&#xff08;附避坑指南&#xff09;开场白&#xff1a;我的第一段代码&#xff0c;老板看完直接让我“回去…

基于Python+Django的高校后勤报修系统源码文档部署文档代码讲解等

课题介绍 本课题针对高校后勤报修流程繁琐、进度不透明、工单管理混乱等痛点&#xff0c;设计并实现基于PythonDjango框架的高校后勤报修系统&#xff0c;构建集报修发起、工单分派、进度追踪、结果反馈于一体的数字化后勤服务平台。系统以MySQL为数据存储核心&#xff0c;结合…

学习随笔-MCP协议与Tools工具集成

MCP协议与Tools工具集成 核心概念理解 1. 大模型的局限性及Tools解决方案 问题&#xff1a;大模型不擅长处理垂直领域实时信息&#xff08;天气、地理位置、业务数据等&#xff09;解决方案&#xff1a;使用Tools机制调用外部系统方法或第三方API实现方式&#xff1a;通过JS…

NETGEAR R6200v2 has an unauthorized memory corruption vulnerability.

Description A pre-authentication global buffer overflow vulnerability exists in the web server component of the Netgear R6200v2 router. The issue resides within the sub_ED50 function during the process…

仅通过提示词用豆包实现项目:爬虫+神经网络对目标图片分类

前言 在AI驱动开发的时代&#xff0c;提示词&#xff08;Prompt&#xff09;是连接人类需求与AI能力的核心桥梁。尤其对于爬虫神经网络这类技术密集型项目&#xff0c;优秀的提示词能让AI精准输出可用代码、高效解决调试问题&#xff0c;甚至缩短50%以上的开发周期。本文将先拆…

2026杭州公司注册代办服务解析:合规高效解决方案

在企业创立初期,公司注册流程涉及工商、税务等多个环节,手续繁杂且对专业性有一定要求。杭州公司注册代办服务通过提供专业的流程指导、材料准备及手续办理等支持,帮助企业简化注册过程,提升效率,确保合规性,成为…

食品异物检测设备市场格局与技术路径解析

在食品工业范畴当中&#xff0c;保证产品安全属于生产的首要前提条件&#xff0c;其中&#xff0c;异物混入比如像金属、玻璃、石子、塑料碎片等这样的情况&#xff0c;是比较常见且极为普遍的风险来源&#xff0c;为了能够确实有效地剔除这些异物&#xff0c;食品X光检测机已变…

数据结构和算法的学习路径

- 无需先学数据结构的算法类型 像线性枚举、基础排序&#xff08;选择、冒泡、插入、计数&#xff09;、前缀和、双指针等算法&#xff0c;主要在数组上操作。 而数组作为基础语法的一部分&#xff0c;大部分学习者在学习编程基础时已掌握&#xff0c;因此学习这类算法前无需专…