一、前期准备工作
- 注册支付宝开放平台账号:
- 访问支付宝开放平台(https://open.alipay.com/),点击 “立即入驻”。
- 选择 “企业账户注册”(若个人开发者开发用于个人业务展示等非商业交易用途的小程序,可选择个人账号注册,但涉及支付功能一般需企业账号)。
- 按照页面提示填写企业邮箱、登录密码等信息,完成注册流程。注册成功后,登录支付宝开放平台。
- 完成开发者认证:
- 在支付宝开放平台的控制台中,找到 “账户中心” – “开发者认证” 选项。
- 选择适合的认证方式,一般企业用户需提交营业执照、法人身份证等相关资料进行实名认证。认证审核时间通常为 1 – 3 个工作日,审核通过后才能进一步申请支付相关权限。
- 创建小程序应用:
- 认证通过后,在开放平台首页点击 “创建应用” 按钮。
- 选择应用类型为 “小程序应用”,并填写应用名称、应用简介等相关信息。应用名称需简洁明了且能体现小程序的主要功能或业务方向。
- 提交应用创建申请后,等待支付宝平台审核,审核通过后即可获得该小程序应用的 AppID,此 AppID 是后续对接支付功能的重要标识。
二、配置相关信息
- 获取支付宝小程序密钥:
- 登录支付宝开放平台,进入已创建的小程序应用详情页面。
- 在 “开发设置” 中,找到 “接口加签方式” 部分。可选择 “公钥证书模式” 或 “密钥模式”。
- 公钥证书模式:点击 “生成密钥”,按照提示生成商户私钥和公钥。将生成的公钥复制粘贴到支付宝开放平台的公钥输入框中,平台会自动生成支付宝公钥证书供下载。商户私钥需妥善保管,不能泄露。
- 密钥模式:选择 “使用支付宝生成密钥” 或 “自行上传密钥”。若选择支付宝生成密钥,平台会生成一对 RSA 密钥(私钥和公钥),私钥供商户下载保存,公钥则显示在平台页面。若自行上传密钥,需按照平台规定的密钥格式生成并上传公钥,同时妥善保管好私钥。
- 配置小程序支付参数:
- 在微信小程序的后端服务器代码中,需要配置与支付宝支付相关的参数。
- 主要参数包括:
- app_id:即支付宝小程序的 AppID,在支付宝开放平台的小程序应用详情中获取。
- merchant_private_key:商户私钥,根据上述获取密钥的方式得到,用于对请求参数进行签名。
- alipay_public_key:支付宝公钥,若采用公钥证书模式,从下载的支付宝公钥证书中提取;若采用密钥模式,在平台页面获取并配置。
- notify_url:支付结果通知回调地址,微信小程序的后端服务器需设置一个可外网访问的 URL,用于接收支付宝服务器发送的支付结果通知。例如 “https://your – server – com/alipay/notify”。确保该 URL 地址正确且能正常响应支付宝的请求。
三、编写代码实现对接
- 创建订单并生成订单信息:
- 在微信小程序前端,当用户确认购买商品或服务,发起支付请求时,首先需要将订单相关信息发送到后端服务器。订单信息通常包括商品或服务名称、数量、单价、总金额、订单编号(商户系统内部唯一)等。
- 后端服务器接收到前端传来的订单信息后,根据支付宝支付接口的要求,构建订单请求参数。示例代码(以js 和 Express 框架为例):
const express = require(‘express’);
const app = express(); const crypto = require(‘crypto’); app.post(‘/createAlipayOrder’, (req, res) => { const { productName, quantity, unitPrice, totalAmount, outTradeNo } = req.body; const appId = ‘your – alipay – appid’; const merchantPrivateKey = ‘your – merchant – private – key’; const alipayPublicKey = ‘your – alipay – public – key’; const notifyUrl = ‘https://your – server – url.com/alipay/notify’; // 构造订单请求参数对象 const orderParams = { app_id: appId, method: ‘alipay.trade.create’, format: ‘JSON’, charset: ‘UTF – 8’, sign_type: ‘RSA2’, timestamp: new Date().toISOString().replace(‘T’,”).replace(‘Z’, ”), version: ‘1.0’, biz_content: JSON.stringify({ out_trade_no: outTradeNo, total_amount: totalAmount, subject: productName, product_code: ‘QUICK_MSECURITY_PAY’ }) }; // 拼接参数字符串 let paramStr = ”; for (const key in orderParams) { if (orderParams[key]!== ”) { paramStr += `${key}=${orderParams[key]}&`; } } paramStr = paramStr.slice(0, -1); // 使用商户私钥进行签名 const sign = crypto.createSign(‘RSA – SHA256’); sign.update(paramStr); const signResult = sign.sign(merchantPrivateKey, ‘base64’); orderParams.sign = signResult; // 发送请求到支付宝创建订单接口 const requestUrl = ‘https://openapi.alipay.com/gateway.do’; // 此处省略发送请求的具体代码,可使用第三方库如axios发送请求 // 假设请求成功,返回支付宝的订单信息 const alipayOrderInfo = { // 模拟返回的订单信息 order_string: ‘app_id=2021000100000001&method=alipay.trade.create&format=JSON&charset=UTF – 8&sign_type=RSA2×tamp=2025 – 04 – 16 12:00:00&version=1.0&biz_content={“out_trade_no”:”202504161200000001″,”total_amount”:”100.00″,”subject”:”商品名称”,”product_code”:”QUICK_MSECURITY_PAY”}&sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’ }; res.send(alipayOrderInfo); }); const port = 3000; app.listen(port, () => { console.log(`Server is running on port ${port}`); }); |
- 小程序前端调起支付宝支付:
- 微信小程序前端接收到后端返回的支付宝订单信息(如上述代码中的order_string)后,使用navigateToMiniProgram方法跳转到支付宝小程序进行支付操作。但微信小程序默认不支持直接跳转到支付宝小程序,需要借助一些第三方解决方案或通过在小程序内打开一个包含支付宝支付链接的网页来实现。
- 使用第三方解决方案(如特定的跨平台支付 SDK):部分第三方支付 SDK 提供了在微信小程序内调起支付宝支付的功能。以某 SDK 为例,首先在小程序项目中引入该 SDK 的相关文件。
- 在页面的 JavaScript 文件中,调用 SDK 的支付方法:
const sdk = require(‘your – sdk – path’);
Page({ data: {}, onPay() { const orderInfo = ‘your – order – string – from – server’; sdk.alipayPay(orderInfo, (res) => { if (res.success) { console.log(‘支付成功’); } else { console.log(‘支付失败’, res.errMsg); } }); } }); |
- 通过网页方式调起支付:后端服务器生成一个包含支付宝支付链接的 HTML 页面,将订单信息通过 URL 参数或隐藏表单等方式传递到该页面。在微信小程序前端,使用navigateTo方法打开一个新页面,页面路径为后端生成的包含支付宝支付链接的 HTML 页面地址。在该 HTML 页面中,使用 JavaScript 代码根据接收到的订单信息,调用支付宝的 JSAPI 来唤起支付宝收银台进行支付。示例 HTML 代码:
<!DOCTYPE html>
<html lang=”zh – CN”> <head> <meta charset=”UTF – 8″> <meta name=”viewport” content=”width=device – width, initial – scale = 1.0″> <title>支付宝支付</title> <script src=”https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.min.js”></script> </head> <body> <script> const urlParams = new URLSearchParams(window.location.search); const orderString = urlParams.get(‘order_string’); alipay.pay(orderString, function (res) { if (res.resultCode === ‘9000’) { console.log(‘支付成功’); } else { console.log(‘支付失败’, res); } }); </script> </body> </html> |
四、支付结果处理
- 接收支付通知:
- 支付宝在用户支付完成后,会向微信小程序后端服务器设置的notify_url地址发送支付结果通知。通知内容为 JSON 格式或表单格式的数据,包含订单号、支付状态、支付金额等关键信息。
- 后端服务器需要在notify_url对应的接口中接收并解析该通知数据。示例代码(以js 和 Express 框架为例):
app.post(‘/alipay/notify’, (req, res) => {
const { app_id, out_trade_no, trade_status, total_amount, sign } = req.body; const appId = ‘your – alipay – appid’; const alipayPublicKey = ‘your – alipay – public – key’; // 验证通知是否来自支付宝 let paramStr = ”; for (const key in req.body) { if (key!==’sign’ && req.body[key]!== ”) { paramStr += `${key}=${req.body[key]}&`; } } paramStr = paramStr.slice(0, -1); const verify = crypto.createVerify(‘RSA – SHA256’); verify.update(paramStr); const isValid = verify.verify(alipayPublicKey, sign, ‘base64’); if (isValid && app_id === appId) { if (trade_status === ‘TRADE_SUCCESS’) { // 更新订单状态为已支付等业务逻辑处理 console.log(‘支付成功,订单号:’, out_trade_no); } else { console.log(‘支付状态异常,订单号:’, out_trade_no); } } else { console.log(‘通知验证失败’); } res.send(‘success’); }); |
- 查询支付结果:
- 由于网络等原因,后端服务器可能未及时收到支付宝的支付结果通知。为确保订单状态的准确性,后端服务器可以调用支付宝的查询订单 API(https://openapi.alipay.com/gateway.do? + method = alipay.trade.query )主动查询订单的支付结果。
- 查询订单接口的请求参数主要包括:
- app_id:支付宝小程序的 AppID。
- out_trade_no:商户系统内部的订单号。
- sign_type:签名类型,与创建订单时一致,一般为 “RSA2”。
- timestamp:当前时间戳,格式需符合支付宝要求。
- sign:根据请求参数和商户私钥按照支付宝签名规则生成的签名。
- 示例代码(以 Python 为例):
import requests
import hashlib import hmac import json import time app_id = ‘your – alipay – appid’ merchant_private_key = ‘your – merchant – private – key’ alipay_public_key = ‘your – alipay – public – key’ out_trade_no = ‘your – order – number’ # 构造请求参数 params = { ‘app_id’: app_id, ‘method’: ‘alipay.trade.query’, ‘format’: ‘JSON’, ‘charset’: ‘UTF – 8’, ‘sign_type’: ‘RSA2’, ‘timestamp’: time.strftime(‘%Y – %m – %d %H:%M:%S’, time.localtime()), ‘version’: ‘1.0’, ‘biz_content’: json.dumps({ ‘out_trade_no’: out_trade_no }) } # 拼接参数字符串 param_str = ” for key, value in params.items(): if value: param_str += f'{key}={value}&’ param_str = param_str[: – 1] # 生成签名 sign = hmac.new(merchant_private_key.encode(‘utf – 8’), param_str.encode(‘utf – 8’), hashlib.sha256).hexdigest() params[‘sign’] = sign # 发送请求 response = requests.post(‘https://openapi.alipay.com/gateway.do’, data = params) result = response.json() if result[‘code’] == ‘10000’: trade_status = result[‘trade_status’] if trade_status == ‘TRADE_SUCCESS’: print(‘支付成功’) else: print(‘支付状态异常’) else: print(‘查询失败’) |