{"id":28493609,"url":"https://github.com/dromara/payment-spring-boot","last_synced_at":"2025-07-08T11:30:30.997Z","repository":{"id":37049394,"uuid":"317590521","full_name":"dromara/payment-spring-boot","owner":"dromara","description":"微信支付V3支付，支持微信优惠券，代金券、商家券、公众号支付、微信小程序支付、分账、支付分、商家券、合单支付、先享卡、电商收付通等全部微信支付功能API，同时满足服务商、商户开发需求。一键集成，上手快，欢迎star。","archived":false,"fork":false,"pushed_at":"2025-03-24T06:07:24.000Z","size":2319,"stargazers_count":813,"open_issues_count":14,"forks_count":178,"subscribers_count":23,"default_branch":"release","last_synced_at":"2025-06-08T09:09:30.422Z","etag":null,"topics":["java","payment","spring-boot","wechat-app","wechat-pay","wechat-sdk"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dromara.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-01T15:50:07.000Z","updated_at":"2025-06-08T08:34:10.000Z","dependencies_parsed_at":"2024-01-17T04:19:06.590Z","dependency_job_id":"d03c514c-eb26-43f3-a960-6ea981d91d8c","html_url":"https://github.com/dromara/payment-spring-boot","commit_stats":null,"previous_names":["notfound403/payment-spring-boot"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/dromara/payment-spring-boot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dromara%2Fpayment-spring-boot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dromara%2Fpayment-spring-boot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dromara%2Fpayment-spring-boot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dromara%2Fpayment-spring-boot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dromara","download_url":"https://codeload.github.com/dromara/payment-spring-boot/tar.gz/refs/heads/release","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dromara%2Fpayment-spring-boot/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264259540,"owners_count":23580831,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","payment","spring-boot","wechat-app","wechat-pay","wechat-sdk"],"created_at":"2025-06-08T09:09:35.911Z","updated_at":"2025-07-08T11:30:30.989Z","avatar_url":"https://github.com/dromara.png","language":"HTML","readme":"   \u003cdiv align=\"center\" style=\"margin-bottom: 10px\"\u003e\u003ch1\u003e最全最好用的微信支付V3 Spring Boot 组件\u003c/h1\u003e\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca target=\"_blank\" href=\"https://github.com/dromara/payment-spring-boot/blob/release/LICENSE\"\u003e\n     \t\u003cimg alt=\"\" src=\"https://img.shields.io/github/license/dromara/payment-spring-boot\"/\u003e\n    \u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://felord.cn\"\u003e\n     \t\u003cimg alt=\"\" src=\"https://img.shields.io/badge/java-8-red\"/\u003e\n    \u003c/a\u003e   \n    \u003ca target=\"_blank\" href=\"https://spring.io\"\u003e\n     \t\u003cimg alt=\"\" src=\"https://img.shields.io/badge/spring%20boot-2.4%2B-brightgreen\"/\u003e\n    \u003c/a\u003e   \n    \u003ca target=\"_blank\" href=\"https://mvnrepository.com/artifact/cn.felord/payment-spring-boot\"\u003e\n     \t\u003cimg alt=\"\" src=\"https://img.shields.io/maven-central/v/cn.felord/payment-spring-boot.svg?style=flat-square\"/\u003e\n    \u003c/a\u003e   \n    \u003ca target=\"_blank\" href=\"https://github.com/dromara/payment-spring-boot\"\u003e\n     \t\u003cimg alt=\"\" src=\"https://img.shields.io/github/stars/dromara/payment-spring-boot?style=social\"/\u003e\n    \u003c/a\u003e    \n    \u003ca target=\"_blank\" href=\"https://gitee.com/dromara/payment-spring-boot/stargazers\"\u003e\n     \t\u003cimg alt=\"\" src=\"https://gitee.com/felord/payment-spring-boot/badge/star.svg?theme=white\"/\u003e\n    \u003c/a\u003e    \n    \u003ca target=\"_blank\" href=\"https://work.weixin.qq.com/kfid/kfc9d9d759f27f087e1\"\u003e\n     \t\u003cimg alt=\"点击立即微信咨询\" src=\"https://img.shields.io/badge/%E7%82%B9%E5%87%BB-%E5%BE%AE%E4%BF%A1%E5%92%A8%E8%AF%A2-brightgreen\"/\u003e\n    \u003c/a\u003e    \n    \u003ca target=\"_blank\" href=\"#\"\u003e\n     \t\u003cimg alt=\"点击加入QQ交流①群（满）\" src=\"https://img.shields.io/badge/QQ%E4%BA%A4%E6%B5%81%E7%BE%A4-945342113（满）-ff69b4\"/\u003e\n    \u003c/a\u003e   \n     \u003ca target=\"_blank\" href=\"https://jq.qq.com/?_wv=1027\u0026k=cCiv8Vlv\"\u003e\n     \t\u003cimg alt=\"点击加入QQ交流②群\" src=\"https://img.shields.io/badge/QQ%E4%BA%A4%E6%B5%81%E7%BE%A4-549174561-ff69b4\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\n\u003cp align=\"center\"\u003e如果你感觉这个项目不错，请点击右上角的Star以鼓励作者，谢谢。\u003c/p\u003e\n\n## 简介\n\nJava微信支付V3支付Spring Boot\nStarter，支持微信优惠券，代金券、商家券、智慧商圈、商家转账到零钱、公众号支付、微信小程序支付、分账、支付分、商家券、合单支付、先享卡、电商收付通等全部微信支付功能API，同时满足多个服务商、多个商户开发需求。一键集成，屏蔽了复杂度，API友好，上手快，欢迎star。\n\n## Maven 最新中央仓库坐标\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003ecn.felord\u003c/groupId\u003e\n    \u003cartifactId\u003epayment-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.21.RELEASE\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## JDK问题\n\n**推荐使用Open JDK**，原因参见[FBI Warning](https://github.com/dromara/payment-spring-boot/issues/5)\n\n## 文档地址\n\n- ~~[payment-spring-boot GitHub文档](https://dromara.github.io/payment-spring-boot) (暂时不可用)~~\n\n## API清单\n\n目前已经实现绝大部分微信支付直连商户和服务商的接口，具体的API明细可查看[API清单(暂时不可用)](https://dromara.github.io/payment-spring-boot/#/wechat_v3_api)\n\u003e 随着版本迭代功能会增加，也可通过API注册表类`WechatPayV3Type`进行API接口检索。\n\n## CHANGELOG\n\n~~更新日志[CHANGELOG](https://dromara.github.io/payment-spring-boot/#/changelog) (暂时不可用)~~\n\n## 使用入门\n\n### 集成配置\n\n~~关于集成配置请详细阅读[payment-spring-boot GitHub文档](https://dromara.github.io/payment-spring-boot)\n中[快速接入](https://dromara.github.io/payment-spring-boot/#/quick_start)章节 (暂时不可用)~~\n\n[关于微信支付公钥](https://pay.weixin.qq.com/doc/v3/merchant/4012153196)\n微信官方推出了微信支付公钥产品以替代原来的微信平台证书,我们对此进行了适配\n相关配置如下\n```yaml\nwechat:\n  pay:\n    v3:\n      #    租户id\n      \u003ctentantId\u003e:\n        # 是否使用微信支付公钥验签 默认false\n        enable-wechat-pay-public: true\n        # 微信支付公钥id\n        wechat-pay-public-key-id: PUB_KEY_ID_1111213\n        # 微信支付公钥路径\n        wechat-pay-public-key-path: 'pub_key.pem'\n        \n        wechat-pay-public-key-absolute-path: ''\n        # 是否启用签名验签方法切换 默认false\n        switch-verify-sign-method: true\n```\n- 对于旧版本商户,若不使用微信支付公钥，则不需要配置上述对应参数，则默认使用微信平台证书验签。\n- 对于新进件的商户，微信官方默认启用支付公钥，需要配置上述参数。其中 `switch-verify-sign-method` 参数不需要配置\n- 若旧版版商户使用微信支付公钥，则需要配置上述参数,并启用 `switch-verify-sign-method : true` [原理参考](https://pay.weixin.qq.com/doc/v3/merchant/4012154180)。\u003cfont color=red\u003e当完成从平台证书切换到微信支付公钥后，请务必将`switch-verify-sign-method`参数设置为false 或删除该字段\u003c/font\u003e\n### 调用示例\n\n#### 开启支付\n\n需要手动通过`@EnableMobilePay`注解开启支付\n\n```java\nimport cn.felord.payment.autoconfigure.EnableMobilePay;\nimport org.springframework.context.annotation.Configuration;\n\n@EnableMobilePay\n@Configuration\npublic class PayConfig {\n}\n```\n\n#### 支付接口调用\n\n这里简单以小程序支付为例，写了一个Spring MVC 控制器，在实践中建议对`WechatApiProvider`进行二次封装作服务层调用\n\n```java \nimport cn.felord.payment.wechat.enumeration.TradeBillType;\nimport cn.felord.payment.wechat.v3.WechatApiProvider;\nimport cn.felord.payment.wechat.v3.WechatDirectPayApi;\nimport cn.felord.payment.wechat.v3.model.*;\nimport com.fasterxml.jackson.databind.node.ObjectNode;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Profile;\nimport org.springframework.core.io.Resource;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.time.LocalDate;\nimport java.time.Month;\n\n/**\n * 支付接口开发样例，以小程序支付为例.\n */\n@Profile({\"wechat\", \"dev\"})\n@RestController\n@RequestMapping(\"/marketing\")\npublic class PayController {\n    @Autowired\n    private WechatApiProvider wechatApiProvider;\n    String TENANT_ID = \"mobile\";\n\n    /**\n     * 总流程建议为 生成商品订单 -\u003e 生成对应的支付订单 -\u003e 支付操作 -\u003e 支付结果回调更新 -\u003e 结束\n     * \u003cp\u003e\n     * 此处建议在商品订单生成之后调用\n     *\n     * @param orderId 商品订单id\n     * @return the object node\n     */\n    @PostMapping(\"/js\")\n    public ObjectNode js(@RequestParam String orderId) {\n\n        //TODO\n        // 查询该orderId下是否生成了支付订单\n        // 如果没有\n        // 新增支付订单存入数据库 并标明支付状态为【待支付】\n        // 根据新生成的支付订单信息向微信支付发起支付 并根据返回结果进行处理\n        // 如果有状态为待支付\n        // 根据待支付订单信息向微信支付发起支付 并根据返回结果进行处理\n        // 如果有状态为待支付之外的状态\n        // 根据产品的业务设计自行实现\n        // 支付状态更新逻辑在【回调接口 /wxpay/callbacks/transaction】中处理  需要幂等处理\n\n        // 开发时需要指定使用的商户租户配置 这里为 mobile 请参考 application-wechat.yml\n\n\n        PayParams payParams = new PayParams();\n\n        payParams.setDescription(\"felord.cn\");\n        //\n        // 商户侧唯一订单号 建议为商户侧支付订单号 订单表主键 或者唯一标识字段\n        payParams.setOutTradeNo(\"X135423420201521613448\");\n        // 需要定义回调通知\n        payParams.setNotifyUrl(\"/wxpay/callbacks/transaction\");\n        Amount amount = new Amount();\n        amount.setTotal(100);\n        payParams.setAmount(amount);\n        // 此类支付  Payer 必传  且openid需要同appid有绑定关系 具体去看文档\n        Payer payer = new Payer();\n        payer.setOpenid(\"ooadI5kQYrrCqpgbisvC8bEw_oUc\");\n        payParams.setPayer(payer);\n\n        return wechatApiProvider.directPayApi(TENANT_ID)\n                .jsPay(payParams)\n                .getBody();\n    }\n\n\n    /**\n     * 下载对账单 如果要解析内容的话自行实现\n     *\n     * @return the response entity\n     */\n    @GetMapping(\"/tradebill\")\n    public ResponseEntity\u003cResource\u003e download() {\n        WechatDirectPayApi wechatDirectPayApi = wechatApiProvider.directPayApi(TENANT_ID);\n\n        TradeBillParams tradeBillParams = new TradeBillParams();\n        tradeBillParams.setBillDate(LocalDate.of(2021, Month.MAY, 20));\n        tradeBillParams.setBillType(TradeBillType.ALL);\n        return wechatDirectPayApi.downloadTradeBill(tradeBillParams);\n    }\n\n    /**\n     * 下载申请资金账单  如果要解析内容的话自行实现\n     *\n     * @return the response entity\n     */\n    @GetMapping(\"/fundflowbill\")\n    public ResponseEntity\u003cResource\u003e fundFlowBill() {\n        WechatDirectPayApi wechatDirectPayApi = wechatApiProvider.directPayApi(TENANT_ID);\n\n        FundFlowBillParams fundFlowBillParams = new FundFlowBillParams();\n        fundFlowBillParams.setBillDate(LocalDate.of(2021, Month.MAY, 20));\n\n        return wechatDirectPayApi.downloadFundFlowBill(fundFlowBillParams);\n    }\n}\n```\n\n#### 回调示例\n\n回调可通过以下示例实现，多租户的回调可将租户ID`tenantId`作为路径参数来实现\n\n```java\nimport cn.felord.payment.wechat.v3.WechatApiProvider;\nimport cn.felord.payment.wechat.v3.WechatMarketingFavorApi;\nimport cn.felord.payment.wechat.v3.WechatPayCallback;\nimport cn.felord.payment.wechat.v3.model.ResponseSignVerifyParams;\nimport lombok.SneakyThrows;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Profile;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestHeader;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * 注意为了演示该配置在使用微信配置application-wechat.yaml才生效\n * \u003cp\u003e\n * 务必保证回调接口的幂等性\n * \u003cp\u003e\n * 微信回调控制器，当支付成功、代金券核销成功后，微信支付服务器会通过回调进行通知商户侧。\n * 商户侧可以根据微信的回调通知进行支付的后续处理，例如支付状态的变更等等。\n * 需要注意的是回调接口需要白名单放行。\n * \u003cp\u003e\n * 开发者只需要编写对结果的{@link java.util.function.Consumer}即可。\n * \u003cp\u003e\n * 请注意：返回的格格式必须是{@link WechatPayCallback} 给出的格式，不能被包装和更改，切记！\n * @author felord.cn\n * @since 1.0.0.RELEASE\n */\n@Profile({\"wechat\", \"dev\"})\n@RestController\n@RequestMapping(\"/wxpay/callbacks\")\npublic class CallbackController {\n    private static final String TENANT_ID = \"mobile\";\n    @Autowired\n    private WechatApiProvider wechatApiProvider;\n\n\n    /**\n     * 代金券核销通知.\n     * \u003cp\u003e\n     * 需要手动调用{@link WechatMarketingFavorApi#setMarketingFavorCallback(String)} 设置，一次性操作!\n     *\n     * @param wechatpaySerial    the wechatpay serial\n     * @param wechatpaySignature the wechatpay signature\n     * @param wechatpayTimestamp the wechatpay timestamp\n     * @param wechatpayNonce     the wechatpay nonce\n     * @param request            the request\n     * @return the map\n     */\n    @SneakyThrows\n    @PostMapping(\"/coupon\")\n    public Map\u003cString, ?\u003e couponCallback(\n            @RequestHeader(\"Wechatpay-Serial\") String wechatpaySerial,\n            @RequestHeader(\"Wechatpay-Signature\") String wechatpaySignature,\n            @RequestHeader(\"Wechatpay-Timestamp\") String wechatpayTimestamp,\n            @RequestHeader(\"Wechatpay-Nonce\") String wechatpayNonce,\n            HttpServletRequest request) {\n        String body = request.getReader().lines().collect(Collectors.joining());\n        // 对请求头进行验签 以确保是微信服务器的调用\n        ResponseSignVerifyParams params = new ResponseSignVerifyParams();\n        params.setWechatpaySerial(wechatpaySerial);\n        params.setWechatpaySignature(wechatpaySignature);\n        params.setWechatpayTimestamp(wechatpayTimestamp);\n        params.setWechatpayNonce(wechatpayNonce);\n        params.setBody(body);\n        return wechatApiProvider.callback(TENANT_ID).couponCallback(params, data -\u003e {\n            //TODO 对回调解析的结果进行消费  需要保证消费的幂等性 微信有可能多次调用此接口\n        });\n    }\n\n    /**\n     * 微信支付成功回调.\n     * \u003cp\u003e\n     * 无需开发者判断，只有扣款成功微信才会回调此接口\n     *\n     * @param wechatpaySerial    the wechatpay serial\n     * @param wechatpaySignature the wechatpay signature\n     * @param wechatpayTimestamp the wechatpay timestamp\n     * @param wechatpayNonce     the wechatpay nonce\n     * @param request            the request\n     * @return the map\n     */\n    @SneakyThrows\n    @PostMapping(\"/transaction\")\n    public Map\u003cString, ?\u003e transactionCallback(\n            @RequestHeader(\"Wechatpay-Serial\") String wechatpaySerial,\n            @RequestHeader(\"Wechatpay-Signature\") String wechatpaySignature,\n            @RequestHeader(\"Wechatpay-Timestamp\") String wechatpayTimestamp,\n            @RequestHeader(\"Wechatpay-Nonce\") String wechatpayNonce,\n            HttpServletRequest request) {\n        String body = request.getReader().lines().collect(Collectors.joining());\n        // 对请求头进行验签 以确保是微信服务器的调用\n        ResponseSignVerifyParams params = new ResponseSignVerifyParams();\n        params.setWechatpaySerial(wechatpaySerial);\n        params.setWechatpaySignature(wechatpaySignature);\n        params.setWechatpayTimestamp(wechatpayTimestamp);\n        params.setWechatpayNonce(wechatpayNonce);\n        params.setBody(body);\n        return wechatApiProvider.callback(TENANT_ID).transactionCallback(params, data -\u003e {\n            //TODO 对回调解析的结果进行消费  需要保证消费的幂等性 微信有可能多次调用此接口\n        });\n    }\n\n    /**\n     * 微信合单支付成功回调.\n     * \u003cp\u003e\n     * 无需开发者判断，只有扣款成功微信才会回调此接口\n     *\n     * @param wechatpaySerial    the wechatpay serial\n     * @param wechatpaySignature the wechatpay signature\n     * @param wechatpayTimestamp the wechatpay timestamp\n     * @param wechatpayNonce     the wechatpay nonce\n     * @param request            the request\n     * @return the map\n     */\n    @SneakyThrows\n    @PostMapping(\"/combine_transaction\")\n    public Map\u003cString, ?\u003e combineTransactionCallback(\n            @RequestHeader(\"Wechatpay-Serial\") String wechatpaySerial,\n            @RequestHeader(\"Wechatpay-Signature\") String wechatpaySignature,\n            @RequestHeader(\"Wechatpay-Timestamp\") String wechatpayTimestamp,\n            @RequestHeader(\"Wechatpay-Nonce\") String wechatpayNonce,\n            HttpServletRequest request) {\n        String body = request.getReader().lines().collect(Collectors.joining());\n        // 对请求头进行验签 以确保是微信服务器的调用\n        ResponseSignVerifyParams params = new ResponseSignVerifyParams();\n        params.setWechatpaySerial(wechatpaySerial);\n        params.setWechatpaySignature(wechatpaySignature);\n        params.setWechatpayTimestamp(wechatpayTimestamp);\n        params.setWechatpayNonce(wechatpayNonce);\n        params.setBody(body);\n        return wechatApiProvider.callback(TENANT_ID).combineTransactionCallback(params, data -\u003e {\n            //TODO 对回调解析的结果进行消费  需要保证消费的幂等性 微信有可能多次调用此接口\n        });\n    }\n}\n```\n\n## 开源协议\n\n**Apache 2.0**\n\n## 仓库地址\n\n- [GitHub](https://github.com/dromara/payment-spring-boot)\n- [Gitee](https://gitee.com/dromara/payment-spring-boot)\n \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdromara%2Fpayment-spring-boot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdromara%2Fpayment-spring-boot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdromara%2Fpayment-spring-boot/lists"}