# bstore-cloud
**Repository Path**: shaoyb/bstore-cloud
## Basic Information
- **Project Name**: bstore-cloud
- **Description**: 杰普-微服务版本-在线商场
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-02-18
- **Last Updated**: 2025-03-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 电子商务系统-前台接口文档
## 1.注册功能
- 请求
- 请求方式:POST
- 请求url:/users
- 请求参数:application/json
```json
{
"username" : "briup",
"password" : "briup",
"avatar" : "1111111",
"gender" : 1,
"birthday" : "2024-05-06",
"phone" : "15947600525"
}
```
- 响应
- 响应参数:
```json'
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 2.登录功能
- 请求
- 请求方式:POST
- 请求资源路径:/auths
- 请求参数:application/json
```json
{
"username" : "briup",
"password" : "briup"
}
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJxaW55YyIsImV4cCI6MTczNTk1MTI0NCwidXNlcklkIjoxLCJpYXQiOjE3MzUwODcyNDQsImp0aSI6IjU4NzMwNTgzMmZiNDQwZTVhYWRiZWY3MzM5MDFkODgzIiwidXNlcm5hbWUiOiJicml1cCJ9.8Bopyt9f0Bq6XiEbZJS-Ce23_2qQRGJVi8W6PL9StPs"
}
```
## 3.获取当前用户信息
- 请求
- 请求方式:GET
- 请求资源路径:/auths
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": {
"username": "briup",
"avatar" : "http://www.qinyc.xyz/2023/08/08/8cd2768d0c414569b50ac33ac19b573b.jpg"
}
}
```
## 4.获取当前用户购物车中商品数量
- 请求
- 请求方式:GET
- 请求资源路径:/shopCars
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": 2
}
```
## 4.修改用户信息
- 请求
- 请求方式:PUT
- 请求资源路径:/users
- 请求参数:
```json
{
"avatar" : "C.cyb3bUpsGhfA102l8mI2_QHaHY&w=250&h=249&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2",
"username" : "briup",
"birthday" : "2024-12-25",
"gender" : "1",
"phone" : "15947600525"
}
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 5.修改密码
- 请求
- 请求方式:PUT
- 请求资源路径:/users/updatePassword
- 请求参数:
```json
{
"confirmPassword" : "123456",
"newPassword" : "123456",
"oldPassword" : "briup"
}
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 6.获取热销商品
- 请求
- 请求方式:GET
- 请求资源路径:/goods
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": [
{
"id" : 1,
"cover" : "",
"name" : "",
"description" : "",
"price" : 100
},
{
"id" : 2,
"cover" : "",
"name" : "",
"description" : "",
"price" : 100
}
]
}
```
## 7.获取商品详情信息
- 请求
- 请求方式:GET
- 请求资源路径:/goods/{id}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": {
"id": 2,
"cover": "",
"name": "",
"description": "",
"price": 100
}
}
```
## 8.退出登录
- 请求
- 请求方式:GET
- 请求资源路径:/auths/logout
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 9.上传接口(本地上传)
- 请求
- 请求方式:POST
- 请求资源路径:/uploads
- 请求参数: form-data
file 上传的文件
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": "http://localhost:8888/img/335cc5cc-407d-46b5-b3b8-a2dea767c934.jpg"
}
```
## 10.判断用户是否收藏某商品
- 请求
- 请求方式:GET
- 请求资源路径:/collects/{goodsId}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": true
}
```
## 11.添加收藏
- 请求
- 请求方式:PUT
- 请求资源路径:/collects/add/{goodsId}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 12.取消收藏
- 请求
- 请求方式:PUT
- 请求资源路径:/collects/remove/{goodsId}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 13.获取收藏列表
- 请求
- 请求方式:GET
- 请求资源路径:/collects
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": [
{
"goodsId": 1,
"name" : "洗衣机",
"price" : 1399,
"cover" : "http://localhost:8888/img/335cc5cc-407d-46b5-b3b8-a2dea767c934.jpg",
"description": "这是台洗衣机"
},
{
"goodsId": 2,
"name" : "美的洗衣机",
"price" : 1299,
"cover" : "http://localhost:8888/img/335cc5cc-407d-46b5-b3b8-a2dea767c934.jpg",
"description": "这是台美的洗衣机"
}
]
}
```
## 14.删除与批量删除收藏信息
- 请求
- 请求方式:DELETE
- 请求资源路径:/collects
- 请求参数: application/json
```json
[1,2]
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 15.将商品填加到购物车
- 请求
- 请求方式:POST
- 请求资源路径:/shopCars/{goodsId}/{num}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 16.删除与批量删除收藏列表
- 请求
- 请求方式:DELETE
- 请求资源路径:/collects
- 请求参数: application/json
```json
[1,2]
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 17.查看购物车列表
- 请求
- 请求方式:GET
- 请求资源路径:/shopCars/getList
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": [
{
"id" : 1,
"goodsId" : 3,
"name" : "洗衣机",
"cover" : "http://localhost:8888/img/335cc5cc-407d-46b5-b3b8-a2dea767c934.jpg",
"price" : 1299,
"num" : 1
},
{
"id" : 2,
"goodsId" : 4,
"name" : "手机",
"cover" : "http://localhost:8888/img/335cc5cc-407d-46b5-b3b8-a2dea767c934.jpg",
"price" : 5999,
"num" : 1
}
]
}
```
## 18.修改购物车商品数量
- 请求
- 请求方式:PUT
- 请求资源路径:/shopCars/{id}/{num}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 19.删除与批量删除购物车信息
- 请求
- 请求方式:DELETE
- 请求资源路径:/shopCars
- 请求参数:
```json
[1,2,3]
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 20.查询当前用户所有收货地址
- 请求
- 请求方式:GET
- 请求资源路径:/address
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": [
{
"id" : 1,
"receiverName":"tom",
"urbanAddr": "兰州市",
"detailAddr": "兰州理工大学",
"phone": "15947600525",
"userId" : 1,
"flag" : 0
}
]
}
```
## 21.新增收货地址
- 请求
- 请求方式:POST
- 请求资源路径:/address
- 请求参数:
```json
{
"receiverName":"tom",
"urbanAddr": "兰州市",
"detailAddr": "兰州理工大学",
"phone": "15947600525"
}
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 22.修改收货地址
- 请求
- 请求方式:PUT
- 请求资源路径:/address
- 请求参数:
```json
{
"id" : 1,
"receiverName":"tom",
"urbanAddr": "兰州市",
"detailAddr": "兰州理工大学",
"phone": "15947600525"
}
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 23.删除收货地址
- 请求
- 请求方式:DELETE
- 请求资源路径:/address/{id}
- 请求参数:无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 23.设置收货地址为默认地址
- 请求
- 请求方式:PUT
- 请求资源路径:/address/set/{id}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 24.取消收货地址为默认地址
- 请求
- 请求方式:PUT
- 请求资源路径:/address/cancel/{id}
- 请求参数:无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 25.提交订单
- 请求
- 请求方式:POST
- 请求资源路径:/orders
- 请求参数: application/json
```json
{
"orderItemCreateDTOs":[
{"goods":5,"num":1},
{"goods":3,"num":1},
{"goods":4,"num":1}
],
"receiveAddress":"兰州市兰州理工大学",
"receivePhone":"15947600525",
"receiveUsername":"tom",
"totalPrice":6514.97
}
```
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": "c41b68d8-85b6-4661-80eb-cdbe081d655c"
}
```
## 26.查询订单信息
- 请求
- 请求方式:GET
- 请求资源路径:/orders
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": [
{
"id" : "232ddc06-47c2-4c74-a5b2-f68ce39e709e",
"create_date" : "2024-12-28",
"receiveAddress":"兰州市兰州理工大学",
"receivePhone":"15947600525",
"receiveUsername":"tom",
"totalPrice":6514.97,
"status" : 1
},
{
"id" : "6cd909c2-21aa-47ce-b40f-f74288fb460b",
"create_date" : "2024-12-28",
"receiveAddress":"兰州市兰州理工大学",
"receivePhone":"15947600525",
"receiveUsername":"briup",
"totalPrice":6514.99,
"status" : 1
}
]
}
```
## 27.关闭订单
- 请求
- 请求方式:PUT
- 请求资源路径:/orders/{id}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": null
}
```
## 28.订单详情
- 请求
- 请求方式:GET
- 请求资源路径:/orders/{id}
- 请求参数: 无
- 响应
- 响应参数示例:
```json
{
"code": 200,
"message": "操作成功",
"data": {
"id" : "232ddc06-47c2-4c74-a5b2-f68ce39e709e",
"receiveUsername" :"tom",
"receivePhone" : "15947600525",
"receiveAddress" : "江苏省苏州市",
"createDate" : "2024-12-29",
"status" : 1,
"orderItems" : [
{
"cover" : "https://s2.loli.net/2024/12/27/TRscZX4VQMzbOu1.jpg",
"name" : "Apple iPhone 14",
"price" : 5999.99,
"num" : 1
}
]
}
}
```
## 支付宝沙箱支付
### 1.介绍
沙箱环境是`支付宝开放平台`为开发者提供的`与生产环境完全隔离的联调测试环境`,**开发者在沙箱环境中完成的接口调用不会对生产环境中的数据造成任何影响。**
沙箱为开放的产品提供`有限功能范围`的支持,可以覆盖产品的绝大部分核心链路和对接逻辑,便于开发者快速学习、尝试、开发和调试。
沙箱环境会自动完成或忽略一些场景的业务门槛,例如:开发者无需等待产品开通,即可直接在沙箱环境调用接口,使得开发集成工作可以与业务流程并行,从而提高项目整体的交付效率。
注意:
- 由于沙箱环境并非 100% 与生产环境一致,接口的实际响应逻辑请以生产环境为准,沙箱环境开发调试完成后,仍然需要在生产环境进行测试验收。
- 沙箱环境拥有完全独立的数据体系,沙箱环境下返回的数据(例如用户 ID 等)在生产环境中都是不存在的,开发者不可将沙箱环境返回的数据与生产环境中的数据混淆。
> [官网地址](https://open.alipay.com/)
>
> [文档地址](https://opendocs.alipay.com/common/02kkv7?pathHash=8fd32ef6)
>
> **合理使用沙箱环境,可以让研发流程与商业流程并行,降低联调资损风险,加速项目的交付。**

### 2.注册开发者账号


### 3. 登录开发者账号


### 4. 配置沙箱环境




> 创建沙箱应用后,需要拿到3个参数,`appId`,`应用私钥`,`支付宝公钥`,用于对接支付接口使用。
### 5. 查看买家与商家信息
> 在沙箱账号中,可以看到买家和商家的账号信息以及账号余额。当支付时填写买家对应信息,支付成功会看到买家余额减少,卖余额增加。

### 6. 下载支付宝沙箱环境APP
> 注意:`目前沙箱钱包仅提供Android版本`

### 7. 内网穿透
> 支付完成后,支付宝需要回调我们的应用开发接口,将支付成功的信息告知给我们。因此,我们需要将回调接口配置到公网环境,这里我们可以通过内网穿透技术将我们的应用公开在公网环境!常见内网穿透工具有很多,这里推荐两个:
>
> - [贝瑞花生壳](https://hsk.oray.com/)
>
> - [netapp](https://natapp.cn/)
>
> 这里使用[贝瑞花生壳](https://hsk.oray.com/)为例
- 注册账号




- 下载客户端




- 扫码登录

- 绑定手机号



- 登录客户端

- 激活内网穿透


- 新增映射规则





- 完成实名认证




### 8. 支付宝沙箱引入Java项目
- 引入依赖
```xml
com.alipay.sdk
alipay-easysdk
2.2.0
com.alipay.sdk
alipay-sdk-java
4.22.113.ALL
```
- 配置参数
```yaml
alipay:
# APPID
appId: 填写自己的应用ID
# 应用私钥
appPrivateKey: 填写自己的应用私钥
# 支付宝公钥
alipayPublicKey: 填写自己的支付宝公钥
# 回调地址
notifyUrl: 填写自己的支付成功回调接口地址(公网地址)
# 协议
protocol: https
# 网关主机
gatewayHost: openapi-sandbox.dl.alipaydev.com
# 网关服务器地址
gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
# 发送数据的格式, 目前为json
format: json
# 设置字符集的编码格式 utf-8
charset: utf-8
# 签名类型(加密算法)
signType: RSA2
```
- 支付属性加载配置类
```java
package com.briup.bookstore.config;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
* 支付属性加载配置类(支付宝沙箱)
* @author qinyc
* @date 2024/06/23
*/
@Data
@Configuration
@ConfigurationProperties("alipay")
public class AliPayConfig {
// 应用Id
private String appId;
// 应用私有
private String appPrivateKey;
// 支付宝公钥
private String alipayPublicKey;
//回调地址
private String notifyUrl;
//协议
private String protocol;
//网关主机
private String gatewayHost;
//签名类型(加密算法)
private String signType;
//设置字符集的编码格式 utf-8
private String charset;
//网关服务器地址
private String gatewayUrl;
//发送数据的格式, 目前为json
private String format;
@PostConstruct
public void init() {
// 设置参数(全局只需设置一次)
Config config = new Config();
config.protocol = this.protocol;
config.gatewayHost = this.gatewayHost;
config.signType = this.signType;
config.appId = this.appId;
config.merchantPrivateKey = this.appPrivateKey;
config.alipayPublicKey = this.alipayPublicKey;
config.notifyUrl = this.notifyUrl;
Factory.setOptions(config);
System.out.println("=======支付宝SDK初始化成功=======");
}
}
```
```java
package com.briup.bookstore.web.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.easysdk.factory.Factory;
import com.briup.bookstore.config.AliPayConfig;
import com.briup.bookstore.dto.OrderPayDTO;
import com.briup.bookstore.po.Order;
import com.briup.bookstore.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
/**
* 阿里支付宝支付Controller
* @author qinyc
* @date 2024/06/23
*/
@RestController
@RequestMapping("/alipay")
public class AliPayController {
@Autowired
private AliPayConfig aliPayConfig;
@Autowired
private OrderService orderService;
@GetMapping("/pay")
public void pay(OrderPayDTO order, HttpServletResponse httpResponse) throws Exception {
//配置阿里支付客户端
AlipayClient alipayClient = new DefaultAlipayClient(aliPayConfig.getGatewayUrl(), aliPayConfig.getAppId(),
aliPayConfig.getAppPrivateKey(), aliPayConfig.getFormat(), aliPayConfig.getCharset(), aliPayConfig.getAlipayPublicKey(), aliPayConfig.getSignType());
//创建支付宝交易页面请求
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
//设置支付成功后支付宝回调地址
request.setNotifyUrl(aliPayConfig.getNotifyUrl());
request.setBizContent("{\"out_trade_no\":\"" + order.getOrderId() + "\","
+ "\"total_amount\":\"" + order.getTotalPrice() + "\","
+ "\"subject\":\"" + order.getItemList() + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//设置支付宝完成支付后跳转的本地页面
request.setReturnUrl("http://localhost:8081/#/order");
String form = "";
try {
// 调用SDK生成表单
form = alipayClient.pageExecute(request).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" + aliPayConfig.getCharset());
// 直接将完整的表单html输出到页面
httpResponse.getWriter().write(form);
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
@PostMapping("/notify") // 注意这里必须是POST接口
public String payNotify(HttpServletRequest request) throws Exception {
if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
System.out.println("=========支付宝异步回调========");
Map params = new HashMap<>();
Map requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name, request.getParameter(name));
}
String tradeNo = params.get("out_trade_no");
String gmtPayment = params.get("gmt_payment");
String alipayTradeNo = params.get("trade_no");
// 支付宝验签
if (Factory.Payment.Common().verifyNotify(params)) {
// 验签通过
System.out.println("交易名称: " + params.get("subject"));
System.out.println("交易状态: " + params.get("trade_status"));
System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
System.out.println("商户订单号: " + params.get("out_trade_no"));
System.out.println("交易金额: " + params.get("total_amount"));
System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
System.out.println("买家付款时间: " + params.get("gmt_payment"));
System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
// 更新订单未已支付
Order order = new Order();
//设置订单ID
order.setId(tradeNo);
//设置订单状态
order.setStatus(2);
//设置支付编号
order.setTrackingNumber(Integer.parseInt(alipayTradeNo));
//设置支付方式
order.setPayWay("支付宝沙箱环境支付");
//设置支付时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
order.setPayDate(LocalDateTime.parse(gmtPayment, formatter));
orderService.updateOrderById(order);
}
}
return "success";
}
}
```
- 效果演示











