uniapp的app项目接入支付宝支付
时间: 2025-05-21 20:34:14 浏览: 65
### 如何在UniApp的APP项目中接入支付宝支付功能
#### 一、准备工作
为了在 UniApp 的 APP 项目中集成支付宝支付功能,需要完成以下准备事项:
1. **申请开发者资质**:前往支付宝开放平台注册并认证成为开发者[^1]。
2. **创建应用**:登录支付宝开放平台后,在控制台创建一个新的移动应用,并记录下分配给该应用的相关配置信息(如 `appid` 和密钥等)[^1]。
---
#### 二、后端实现
后端负责生成支付订单以及接收支付宝的通知回调。以下是具体步骤:
##### 2.1 引入支付宝 SDK 依赖
编辑项目的 `pom.xml` 文件,引入支付宝官方提供的 Java SDK[^1]:
```xml
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.27.8.ALL</version>
</dependency>
```
##### 2.2 配置文件设置
修改 `application.yml` 或其他环境变量配置文件,填写支付宝相关参数[^1]:
```yaml
alipay:
app-id: your_app_id_here
merchant-private-key: your_merchant_private_key_here
alipay-public-key: your_alipay_public_key_here
notify-url: http://yourdomain.com/notify_url
return-url: http://yourdomain.com/return_url
charset: UTF-8
sign-type: RSA2
```
##### 2.3 后端核心代码
###### (1) 支付宝配置类 (`AlipayConfig.java`)
定义全局使用的支付宝基础配置项[^1]:
```java
public class AlipayConfig {
public static final String APP_ID = "your_app_id";
public static final String PRIVATE_KEY = "your_private_key";
public static final String PUBLIC_KEY = "your_public_key";
public static final String GATEWAY_URL = "https://openapi.alipay.com/gateway.do";
}
```
###### (2) 支付接口逻辑
编写一个 RESTful 接口供前端调用,返回经过签名后的支付请求字符串[^1]:
```java
@RestController
@RequestMapping("/pay")
public class PayController {
@PostMapping("/createOrder")
public Map<String, Object> createOrder(@RequestBody OrderRequest request) throws Exception {
// 初始化客户端实例
DefaultAlipayClient client = new DefaultAlipayClient(
AlipayConfig.GATEWAY_URL,
AlipayConfig.APP_ID,
AlipayConfig.PRIVATE_KEY,
"json",
"UTF-8",
AlipayConfig.PUBLIC_KEY,
"RSA2"
);
// 创建支付请求对象
AlipayTradeAppPayRequest payRequest = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo(request.getOrderNo()); // 商户订单号
model.setTotalAmount(String.valueOf(request.getAmount())); // 订单金额
model.setSubject("商品描述"); // 商品名称
model.setBody("商品详情"); // 商品备注
payRequest.setBizModel(model);
payRequest.setNotifyUrl(AlipayConfig.NOTIFY_URL);
// 调用支付宝接口发起支付
String result = client.sdkExecute(payRequest).getBody();
HashMap<String, Object> responseMap = new HashMap<>();
responseMap.put("orderInfo", result);
return responseMap;
}
}
```
###### (3) 支付回调处理接口
当用户完成支付后,支付宝会向指定 URL 发送异步通知消息。需验证通知的真实性后再更新数据库状态:
```java
@PostMapping("/notify")
public void handleNotify(HttpServletRequest request) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
StringBuilder body = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
body.append(line);
}
try {
// 解析通知数据
Map<String, String> params = parseQueryString(body.toString());
boolean verifyResult = AlipaySignature.rsaCheckV1(params, AlipayConfig.PUBLIC_KEY, "UTF-8", "RSA2");
if (verifyResult && "TRADE_SUCCESS".equals(params.get("trade_status"))) {
// 更新本地订单状态为已支付
updateOrderStatusToPaid(params.get("out_trade_no"));
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
private Map<String, String> parseQueryString(String queryString) {
Map<String, String> map = new HashMap<>();
Arrays.stream(queryString.split("&")).forEach(pair -> {
String[] keyValue = pair.split("=");
if (keyValue.length == 2) {
map.put(keyValue[0], keyValue[1]);
}
});
return map;
}
```
---
#### 三、前端实现
前端主要通过调用 `uni.requestPayment` 方法来触发支付流程[^2]:
##### 3.1 请求支付接口
先从服务器获取支付所需的订单信息(即 `orderInfo` 字符串),再将其传递至原生支付组件[^2]:
```javascript
async function getAliPayOrder() {
const res = await uniCloud.callFunction({
name: 'get-alipay-order',
data: { amount: 9.99, orderNo: Date.now().toString() },
});
if (!res.result.success) {
console.error('获取支付订单失败:', res.errMsg || res.message);
return false;
}
this.aliPayJson = res.result.orderInfo; // 将服务端返回的数据存储到 Vue 数据模型中
return true;
}
```
##### 3.2 执行支付操作
利用 `uni.requestPayment` 提交支付请求:
```javascript
async function performAliPay() {
let isValid = await this.getAliPayOrder(); // 获取支付订单
if (!isValid) return;
uni.requestPayment({
provider: 'alipay', // 指定服务商为支付宝
orderInfo: this.aliPayJson, // 来自后端的服务端签名结果
success(res) {
console.log('支付成功!', res);
uni.showToast({ title: '支付成功' });
},
fail(err) {
console.warn('支付失败:', err);
uni.showToast({ icon: 'none', title: '支付失败:' + JSON.stringify(err) });
},
});
}
```
---
#### 四、常见问题排查
1. 如果遇到 “商家订单参数异常”,通常是因为传送给支付宝的某些字段不符合其校验规则,请仔细核对文档中的必填项说明。
2. 确保前后端时间同步一致;如果存在较大偏差,则可能导致签名失效等问题发生[^1]。
---
阅读全文
相关推荐

















