手把手教你接入网站微信支付

news/2024/10/22 17:27:38/

文章目录

    • 为何需要接入微信支付?
    • 申请微信公众号
    • 申请商户号
    • Java SDK代码示例
      • 支付流程
      • Native API的使用示例
      • 支付结果通知
    • 第三方支付平台
    • 相关法规
    • 相关链接
      • 支付宝支付接入

为何需要接入微信支付?

小摊小贩们在线下交易一般无需接入微信支付,只需要向别人出示自己的付款码就行。为什么?因为一手交钱,一手交货,你不付钱,人家不会给你商品。

但在网上,要实现无人值守,别人扫码付了款,平台得自动知道,然后再发货。所以必须接入微信支付。

微信支付必须是企业主体,要有营业执照才能申请。
本文简单整理了一下该过程,备忘。

提一下,微信开放平台和微信公众平台是两个独立的平台,账号不能互通,如果你的网站想接入微信支付和微信登录,对不起,各交300块,这是腾讯的坑人之处。

申请微信公众号

首先你要有一个微信账号,然后申请服务号或公众号。
申请地址:https://mp.weixin.qq.com
在这里插入图片描述

  • 通过邮箱激活你的微信公众平台帐号。
  • 在左菜单栏里"微信认证"里进行认证,通过后支付300块给微信支付平台。
  • 等待腾讯工作人员审核,如果资料无误,大致一到两个工作日就会审核通过。

申请商户号

  • 申请商户号
    说明文档
    https://pay.weixin.qq.com/index.php/core/info

  • 关联一个appId,搜索appId, 然后提交申请

  • 在公众号侧,菜单”微信支付“里确认申请

  • 管理成功后,会看到相应的appId:

在这里插入图片描述

  • 申请证书和设置APIv3秘钥,在"API安全"里:
    在这里插入图片描述
    这个证书和秘钥是为后续开发做准备的。

Java SDK代码示例

支付流程

在这里插入图片描述

Native API的使用示例

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
import com.wechat.pay.java.service.payments.jsapi.model.Amount;
import com.wechat.pay.java.service.payments.jsapi.model.Payer;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;public class WechatPayClient {/** 商户号 */public static String merchantId = "1238205867";/** AppId */public static String appId = "wx68239edec2543d9b1";/** 商户API私钥路径 */public static String privateKeyPath = "/Users/liu/cert/apiclient_key.pem";/** 商户证书序列号 */public static String merchantSerialNumber = "62290C9EC18AA37BECF21972F0D166C57B2B49E9";/** 商户APIV3密钥 */public static String apiV3key = "K1876JinysaSong2012JindsaiSong201";public static void main(String[] args) {// 使用自动更新平台证书的RSA配置// 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错Config config =new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3key).build();// 构建serviceNativePayService service = new NativePayService.Builder().config(config).build();// request.setXxx(val)设置所需参数,具体参数可见Request定义PrepayRequest request = new PrepayRequest();Amount amount = new Amount();amount.setTotal(100);request.setAmount(amount);request.setAppid("wxa9d9651ae******");request.setMchid("190000****");request.setDescription("测试商品标题");request.setNotifyUrl("https://notify_url");request.setOutTradeNo("out_trade_no_001");// 调用下单方法,得到应答PrepayResponse response = service.prepay(request);// 使用微信扫描 code_url 对应的二维码,即可体验Native支付System.out.println(response.getCodeUrl());}
}

上述notify_url用于接收微信平台的通知。一旦支付完成,商户平台通过notify_url接收通知,然后发货。notify_url必须为直接可访问的URL,不允许携带查询串,要求必须为https地址。

支付结果通知

支付结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。

下面详细描述对通知数据进行解密的流程:

用商户平台上设置的APIv3密钥(微信商户平台(pay.weixin.qq.com)-账户设置-API安全-设置APIv3密钥),记为key。
针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data。
使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象

示例代码:

@RequestMapping(value = "/notify", method = {RequestMethod.POST})public @ResponseBodyvoid doNotify(HttpServletRequest request, HttpServletResponse response, @RequestBody String requestBody) {log.debug("微信支付成功!");String serialNumber = request.getHeader("Wechatpay-Serial");String nonce = request.getHeader("Wechatpay-Nonce");String signature = request.getHeader("Wechatpay-Signature");String timestamp = request.getHeader("Wechatpay-Timestamp");log.debug("微信支付流水号为: {}", serialNumber);getTransaction(serialNumber, nonce, signature, timestamp, requestBody);}/*** 获得支付交易* @param wechatPayCertificateSerialNumber* @param nonce* @param signature* @param timestamp* @param requestBody* @return*/public Transaction getTransaction(String wechatPayCertificateSerialNumber,String nonce, String signature, String timestamp,String requestBody) {// 构造 RequestParamRequestParam requestParam = new RequestParam.Builder().serialNumber(wechatPayCertificateSerialNumber).nonce(nonce).signature(signature).timestamp(timestamp).body(requestBody).build();// 如果已经初始化了 RSAAutoCertificateConfig,可直接使用// 没有的话,则构造一个NotificationConfig config = new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3key).build();// 初始化 NotificationParserNotificationParser parser = new NotificationParser(config);// 以支付通知回调为例,验签、解密并转换成 TransactionTransaction transaction = parser.parse(requestParam, Transaction.class);return transaction;}

第三方支付平台

除了微信支付,还有支付宝,有无统一的支付接入方式、同时支持它们呢?

  • https://gitee.com/jumbot/JumbotPay

  • https://github.com/isaltyfish/unipay

  • 聚合二维码:二维彩虹二维码,https://zhuanlan.zhihu.com/p/371158814

相关法规

2022年央行颁布了两个新政策,第一个就是不能够使用远程扫码支付。第二个就是个人收款码不再具有商用用途。

相关链接

  • 微信官方文档
  • 微信公众号平台
  • 腾讯客服
  • 商户平台
  • 申请商户证书用到的工具:
    windows版本
    mac版本
  • 微信支付Java SDK
  • 微信支付v3 API文档
  • 微信支付Native方式API说明
  • Java版微信/支付宝支付

支付宝支付接入

  • 支付宝接入文档

http://www.ppmy.cn/news/75222.html

相关文章

lwIP更新记01:全局互斥锁替代消息机制

从 lwIP-2.0.0 开始,在 opt.h 中多了一个宏开关 LWIP_TCPIP_CORE_LOCKING,默认使能。这个宏用于启用 内核锁定 功能,使用 全局互斥锁 实现。在之前,lwIP 使用 消息机制 解决 lwIP 内核线程安全问题。消息机制易于实现,…

如何在IDEA中显示时序图

如何在IDEA中显示时序图 有时候,我们想要了解代码的运行过程的时候,想要看到方法的调用流程。 这个时候就希望有一个时序图可以看,但是人工来画时序图太麻烦了,有没有办法在IDEA中直接生成呢? 当然是可以的。 这里…

【SpringMVC框架】--01.简介、入门、@RequestMapping、获取请求参数、域对象共享数据、视图、RestFul

文章目录 SpringMVC1.简介1.1 什么是MVC1.2 什么是SpringMVC1.3 SpringMVC的特点 2.编写HelloWorld2.1 创建maven工程2.2 配置web.xml2.3 创建请求控制器2.4 创建springMVC的配置文件2.5测试HelloWorld2.6总结 3.RequestMapping注解3.1 RequestMapping注解的功能3.2 RequestMap…

内行才知道的大数据分析平台

随着这几年来市场需求的增长以及技术的更新,大数据分析平台越来越多地出现在大家的需求采购单上,但面对大数据分析平台,又有多少人知道他们之间的优势区别?今天就从尽量用小白的语言,聊聊内行眼里的大数据分析平台。 …

get_posts与WP_Query区别与各自的优势-wordpress

在 WordPress 中,get_posts 和 WP_Query 都是用于获取文章(post)和页面(page)的函数。它们有一些相似之处,但也有一些区别。 get_posts 是一个简单的函数,用于获取符合特定条件的文章或页面。它…

Systrace系列7 —— Vsync 解读

本文主要是是介绍 Android 中的 Vsync 机制。文章会从 Systrace 的角度来看 Android 系统如何基于 Vsync 每一帧的展示。Vsync 是 Systrace 中一个非常关键的机制,虽然我们在操作手机的时候看不见,摸不着,但是在 Systrace 中我们可以看到,Android 系统在 Vsync 信号的指引下…

F103ZET6使用FSMC和HAL点亮ILI9341

前言 将标准库下的ILI9341驱动移植到使用CubeMX生成的HAL库环境,并成功运行。 一、STM32CubeMX生成框架 (一)配置RCC、SYS和时钟树 参见常规配置。 (二)配置FSMC 1、原理图引脚定义 LCD8080接口使用的引脚主要分…

java.util.concurrent.atomic

java.util.concurrent.atomic是Java中的一个包,提供了一组原子操作类,用于在多线程环境下进行原子性操作。这些类可用于实现线程安全的、无锁的操作,保证操作的原子性,避免数据竞争和线程冲突。以下是java.util.concurrent.atomic…