{"id":15521886,"url":"https://github.com/yeautyye/justpay","last_synced_at":"2025-08-21T10:31:35.123Z","repository":{"id":58758388,"uuid":"126795186","full_name":"YeautyYE/justpay","owner":"YeautyYE","description":"spring-boot2.0.0+Dubbox+spring-webflux的轻量级分布式聚合支付","archived":false,"fork":false,"pushed_at":"2023-10-11T20:58:11.000Z","size":83,"stargazers_count":109,"open_issues_count":2,"forks_count":66,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-12-10T08:42:26.704Z","etag":null,"topics":["alipay","dubbox","java","pay","spring","spring-webflux","springboot","wechatpay"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/YeautyYE.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-26T08:07:50.000Z","updated_at":"2024-05-18T01:43:54.000Z","dependencies_parsed_at":"2022-09-07T08:23:28.667Z","dependency_job_id":null,"html_url":"https://github.com/YeautyYE/justpay","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YeautyYE%2Fjustpay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YeautyYE%2Fjustpay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YeautyYE%2Fjustpay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YeautyYE%2Fjustpay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/YeautyYE","download_url":"https://codeload.github.com/YeautyYE/justpay/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230507051,"owners_count":18236944,"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":["alipay","dubbox","java","pay","spring","spring-webflux","springboot","wechatpay"],"created_at":"2024-10-02T10:38:23.433Z","updated_at":"2024-12-19T22:08:26.463Z","avatar_url":"https://github.com/YeautyYE.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](https://img.shields.io/badge/just-pay-lightgrey.svg?colorA=d9d0c7\u0026colorB=9fe0f6)\n\n### 感谢、致敬\n---\n\u003e感谢xxpay聚合支付的开源！这是个很棒的项目~本项目在xxpay中学到了很多好的思想及代码规范！\n\u003eXxPay官网：http://www.xxpay.org\n\n\u003e感谢Binary Wang的开源微信支付sdk，里面实现好了绝大多数微信支付的功能，使得我们简单的去调用(他还有很多关于微信的tool)\n\u003eBinary Wang主页：https://github.com/binarywang\n\n---\n\n\n\n## 项目介绍\n![](https://img.shields.io/badge/build-passing-brightgreen.svg) ![](https://img.shields.io/badge/downloads-3M-brightgreen.svg) ![](https://img.shields.io/badge/jdk-1.8-blue.svg) ![](https://img.shields.io/badge/springboot-2.0.0-blue.svg)  ![](https://img.shields.io/badge/springwebflux-2.0.0-blue.svg) ![](https://img.shields.io/badge/maven-3.3.9-blue.svg)  ![](https://img.shields.io/badge/Dubbox-2.8.4-blue.svg) ![](https://img.shields.io/badge/zookeeper-3.4.10-blue.svg) ![](https://img.shields.io/badge/IDEA-2017.2.3-blue.svg)\n\n- `Justpay` 使用Java开发，使用spring-boot2.0.0、dubbox实现SOA的分布式架构\n- 只完成与支付相关的功能（支付、回调、查询、退款），没有其它业务逻辑相关模块，可直接接入生产环境\n- 不同功能拆分成不同的服务，使得不同的支付服务更容易根据并发进行集群（可插拔）\n- 使用了spring-boot2.0.0中新集成的spring-webflux (reactor)\n- 目前实现了微信支付（4种模式：NATIVE、JSAPI、APP、MWEB），支付宝支付（4种模式：PC、WAP、APP）\n- Justpay架构图![](https://i.imgur.com/frTlp7H.png)\n- Justpay接入到原系统中的架构位置![](https://i.imgur.com/daz7TbV.png)\n\n## 项目结构\n\n```\njustpay\n├── justpay-common -- 公共模块\n|    ├── justpay-config-interface -- 配置服务接口\n|    ├── justpay-config-pojo -- 支付配置相关类\n|    └── justpay-config-service -- 配置服务生产者\n├── justpay-dispatcher -- 功能分发层\n|    ├── justpay-dispatcher-interface -- 功能分发层接口\n|    └── justpay-dispatcher-service -- 功能分发层服务生产者\n└── justpay-pay -- 支付服务\n     ├── justpay-pay-ali -- 支付宝支付\n     |    ├── justpay-pay-ali-interface --支付宝接口\n     |    └── justpay-pay-ali-service -- 支付宝服务生产者\n     └── justpay-pay-wechat -- 微信支付\n          ├── justpay-pay-wechat-interface --微信接口\n          └── justpay-pay-wechat-service -- 微信服务生产者\n```\n#### 说明\n\n| 项目  | 端口 | 描述 | 依赖\n|---|---|---|---\n|justpay-pay-ali-service|9091|支付宝服务提供者、配置服务消费者|justpay-pay-ali-interface、justpay-common\n|justpay-pay-wechat-service|9092|微信服务提供者、配置服务消费者|justpay-pay-wechat-interface、justpay-common\n|justpay-dispatcher-service|9093|Justpay服务提供者、支付服务消费者|justpay-dispatcher-interface、justpay-pay-ali-interface、justpay-pay-wechat-interface、justpay-common\n\n\n- 项目启动顺序：\n  - \u003ckbd\u003ejustpay-pay-ali-service\u003c/kbd\u003e、\u003ckbd\u003ejustpay-pay-wechat-service\u003c/kbd\u003e \u003e \u003ckbd\u003ejustpay-dispatcher-service\u003c/kbd\u003e\n\n#### Dubbox\n- 进入https://github.com/dangdangdotcom/dubbox ，将源码下载（当当网没有提交上maven仓库，所以不能直接从中央仓库依赖）；打包进本地仓库\n```\nmvn clean install -DskipTests\n```\n\n\n## 快速启动\n\n1. 修改配置服务中的支付宝/微信配置文件  \n![](https://i.imgur.com/7TqAARJ.png)![](https://i.imgur.com/5iD3EEK.png)\n2. 修改启动项目中的zookeeper地址（这里使用的是dev配置，对于配置的切换请参考spring-boot文档）  \n![](https://i.imgur.com/GBiDaiZ.png)![](https://i.imgur.com/oRchUgF.png)![](https://i.imgur.com/C0IQ5ja.png)\n3. 启动项目（ \u003ckbd\u003ejustpay-pay-ali-service\u003c/kbd\u003e、\u003ckbd\u003ejustpay-pay-wechat-service\u003c/kbd\u003e \u003e \u003ckbd\u003ejustpay-dispatcher-service\u003c/kbd\u003e；推荐使用debug启动）  \n![](https://i.imgur.com/2Y9mEt9.png)![](https://i.imgur.com/esHvUBV.png)![](https://i.imgur.com/hNRiDQd.png)\n4. 测试项目是否正常\n- 在浏览器输入 http://localhost:9093/pay/wechat_native/qrcode/1/微信测试商品/order_no_001 查看是否出现二维码，用微信扫一扫，是否金额为0.01\n- 在浏览器输入 http://localhost:9093/pay/ali_pc/page/1/支付宝测试商品/order_no_001 查看是否跳转到支付宝支付页面，是否金额为0.01\n- 如果都没问题~恭喜你！项目已经完美的启动了！\n\n\n## 接入\n\n\u003e 项目接入方式有多种\n\n- Dubbox : 将功能分发层中的接口(DispatcherService)复制到业务逻辑模块，通过Dubbox调用即可  \n  ![](https://i.imgur.com/R5DZIro.png)\n- HTTP : 将请求发送到分发层的controller中（PayController中的build方法仅将参数适配到DispatcherService中，NotifyController简单适配了回调、QueryController简单适配了查询、RefundController简单适配了退款；PayController中还包含spring-webflux写出支付宝支付页面、微信支付二维码的展示代码）\n  ![](https://i.imgur.com/zIDQzYJ.png)\n- 其它RPC方式 : Thrift、GRPC等，只需对DispatcherService进行加强即可\n\n## 测试用例(针对:DispatcherService进行测试)\n\n- 在justpay-dispatcher-service的test里面有所有操作的测试用例，可以直接设置参数进行测试![](https://i.imgur.com/qRSfRJa.png)\n- 也可以通过HTTP请求controller进行测试\n\n\n## API列表(入口:DispatcherService)\n\n#### 参数说明\n\n| 字段名  | 变量名 | 类型 | 示例 | 描述\n|---|---|---|---|---\n|操作类型|operation|String(20)|PAY_ALIPAY_WAP|用于判断下单、回调、查询、退款\n|订单号|outTradeNo|String(32)|XD20160427210604000490|根据业务逻辑生成的订单号\n|Usre-Agent|userAgent|String(32)|Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36|请求头中的Usre-Agent\n|支付金额|amount|String(10)|1000|单位：分，不能超过2147483647\n|客户端IP|clientIp|String(15)|210.73.10.148|客户端IP地址\n|商品标题|title|String(64)|justpay测试用商品|商品名称\n|副标题|subtitle|String(128)|商品副标题|副标题\n|通知地址|notifyUrl|String(200)|http://notify.justpay.com|支付结果回调URL(要在外网可访问)\n|微信用户openid|openid|String(28)|o5nr6jl2kDeODxkHrp-AdBVud3N8|微信用户在商户对应appid下的唯一标识\n|商品ID|productId|String(32)|PRO00011011|商户自行定义\n|场景信息|sceneInfo|String(2000)|{\"store_info\":{\"id\": \"门店ID\",\"name\": \"名称\",\"area_code\": \"编码\",\"address\": \"地址\" }|用于上报场景信息，目前支持上报实际门店信息\n|同步地址|returnUrl|String(200)|http://return.justpay.com|支付宝支付时的同步地址\n|设备号|deviceInfo|String(32)|YY-DD-001|记录在哪台设备完成支付\n|回调数据|notifyData|String(2000)|-|微信/支付宝的回调数据，放这里\n|退款单号|outRefundNo|String(32)|TC20160427210604000490|同一退款单号多次请求只退一笔\n|退款金额|refundAmount|String(10)|100|单位：分，不能超过2147483647\n\n\n###### 下单请求\n\n| 字段名  | 变量名 | 必填 | 可选值/传入值 | 描述\n|---|---|---|---|---\n|操作类型|operation|是|PAY_AUTO（自动）、PAY_ALIPAY_WAP（支付宝手机网页。常用）、PAY_ALIPAY_PC（支付宝电脑网页）、PAY_ALIPAY_APP（支付宝APP支付，是自己的APP，不是支付宝APP）、PAY_WECHAT_NATIVE（微信扫码。常用）、PAY_WECHAT_JSAPI（微信公众号支付）、PAY_WECHAT_APP（微信公APP支付）、PAY_WECHAT_MWEB（微信H5支付）|支付宝PAY_ALIPAY_WAP可实现手机网页及支付宝支付，微信PAY_WECHAT_NATIVE通过跳转可实现手机网页及微信支付\n|订单号|outTradeNo|是|自定义|根据业务逻辑生成的订单号\n|User-Agent|userAgent|operation为PAY_AUTO时必填|用户请求中的User-Agent|当operation为PAY_AUTO时，根据User-Agent，自动选择使用哪种下单方式（不推荐使用）\n|支付金额|amount|是|自定义|单位：分，不能超过2147483647\n|客户端IP|clientIp|是|从用户中获取|客户端IP地址\n|商品标题|title|是|自定义|商品名称，对应支付宝中的subject、对应微信中的body\n|副标题|subtitle|否|商品副标题|副标题，对应支付宝中的body\n|通知地址|notifyUrl|是|自定义|支付结果回调URL(要在外网可访问)\n|微信用户openid|openid|operation为PAY_WECHAT_JSAPI时必填|在微信公众号后台获取|微信用户在商户对应appid下的唯一标识\n|商品ID|productId|operation为PAY_WECHAT_NATIVE时必填|自定义|商户自行定义\n|场景信息|sceneInfo|operation为PAY_WECHAT_MWEB时必填|根据微信接口格式自定义|用于上报场景信息，目前支持上报实际门店信息\n|同步地址|returnUrl|否|自定义|支付宝支付时的同步地址（支付完成后跳转的页面）\n|设备号|deviceInfo|否|自定义|记录在哪台设备完成支付\n\n###### 回调请求\n\n| 字段名  | 变量名 | 必填 | 可选值/传入值 | 描述\n|---|---|---|---|---\n|操作类型|operation|是|NOTIFY_ALI（支付宝）、NOTIFY_WECHAT（微信）、NOTIFY_AUTO（自动判断，不推荐）|用于判断进行哪种回调操作\n|回调数据|notifyData|是|微信回调信息直接原格式放入；支付宝为form提交，需转为json再放入|微信/支付宝的回调数据，放这里\n\n###### 查询请求\n\n| 字段名  | 变量名 | 必填 | 可选值/传入值 | 描述\n|---|---|---|---|---\n|操作类型|operation|是|QUERY_ALI（支付宝）、QUERY_WECHAT（微信）|用于判断进行哪种查询操作\n|订单号|outTradeNo|是|自定义|根据业务逻辑生成的订单号\n\n###### 退款请求\n\n| 字段名  | 变量名 | 必填 | 可选值/传入值 | 描述\n|---|---|---|---|---\n|操作类型|operation|是|REFUND_ALI（支付宝）、REFUND_WECHAT（微信）|用于判断进行哪种查询操作\n|订单号|outTradeNo|是|自定义|根据业务逻辑生成的订单号\n|退款金额|refundAmount|是|自定义|需要退款的金额\n|退款单号|outRefundNo|REFUND_WECHAT时必填|自定义|微信退款时需要为每一笔退款生成一个退款单号\n|金额|amount|REFUND_WECHAT时必填|自定义|outTradeNo订单的总金额\n\n\n###### 下单响应\n\n| 字段名  | 变量名 | 必须 | 示例值 | 描述\n|---|---|---|---|---\n|返回状态码|return_code|是|SUCCESS|SUCCESS/FAIL；SUCCESS则为业务成功\n|返回信息|return_msg|否|下单失败，原因XXX|返回信息，如非空，为错误原因\n|错误信息描述|err_code_des|否|INVALID_REQUEST:201 商户订单号重复|错误描述，如非空，为错误描述\n|订单号|outTradeNo|是|XD20160427210604000490|订单号\n|二维码链接|codeUrl|否|weixin://wxpay/bizpayurl?pr=GhvBPEd|微信NATIVE请求时返回，直接用于跳转（也可用于生成二维码）\n|预付Id|prepayId|否|wx2017091316324779a6d4242a0142314121|微信返回，用于2小时内做特殊操作\n|APP支付参数|payParams|否|json数据|微信JSAPI请求时返回，用于给公众号使用；支付宝APP请求时返回，用于自己的APP上支付宝支付\n|表单|form|否|html数据|支付宝返回，需要把这段写到页面上\n\n###### 回调响应\n\n| 字段名  | 变量名 | 必须 | 示例值 | 描述\n|---|---|---|---|---\n|返回状态码|return_code|是|SUCCESS|SUCCESS/FAIL；SUCCESS则为回调签名验证成功\n|返回信息|return_msg|否|验证失败，原因XXX|返回信息，如非空，为错误原因\n|成功|successReturn|否|--支付宝/微信格式不同--|签名验证成功时才有，若逻辑判断通过，可直接返回此内容给平台\n|错误返回格式|failReturn|是|--支付宝/微信格式不同--|无论签名验证成功失败都会有。若验证成功，但前端逻辑判断失败（如金额不对），可返回此内容给平台\n\n###### 查询响应\n\n| 字段名  | 变量名 | 必须 | 示例值 | 描述\n|---|---|---|---|---\n|返回状态码|return_code|是|SUCCESS|SUCCESS/FAIL；SUCCESS则为查找订单成功\n|返回信息|return_msg|否|查询失败|返回信息，如非空，为错误原因\n|错误信息描述|err_code_des|否|交易不存在|错误描述，如非空，为错误描述\n|查询数据|queryData|否|平台返回的消息|从平台中查到的数据;属性已经解析出来了（支付状态在tradeState），若要拿到原生请求信息，从xmlString(微信)/body(支付宝)中获取\n\n###### 退款响应\n\n| 字段名  | 变量名 | 必须 | 示例值 | 描述\n|---|---|---|---|---\n|返回状态码|return_code|是|SUCCESS|SUCCESS/FAIL；SUCCESS则为退款成功\n|返回信息|return_msg|否|退款失败|返回信息，如非空，为错误原因\n|错误信息描述|err_code_des|否|交易不存在|错误描述，如非空，为错误描述\n|退款数据|refundData|否|json数据|从平台中查到的数据;属性已经解析出来了，若要拿到原生请求信息，从xmlString(微信)/body(支付宝)中获取\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeautyye%2Fjustpay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyeautyye%2Fjustpay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeautyye%2Fjustpay/lists"}