🔍 登录 注册

不同语言中实现支付宝支付和支付回调

大 大苹果 2024-07-11 linux 👁 22 ⏱ 9min

在不同语言中实现支付宝支付和支付回调

在这篇文章中,我们将展示如何在多个编程语言中实现支付宝支付功能,并处理支付回调。我们将覆盖以下几种语言:Node.js、Python 和 Java。

前提条件

在开始之前,请确保您已经完成以下准备工作:

  1. 注册并登录支付宝开发者平台.
  2. 创建应用并获取应用ID、私钥、公钥和支付宝公钥。
  3. 安装所需的SDK和依赖包。

Node.js实现

安装依赖

首先,我们需要安装支付宝的SDK和其他依赖:

npm install alipay-sdk --save
npm install koa koa-router --save

创建支付请求

const AlipaySdk = require('alipay-sdk').default;
const alipaySdk = new AlipaySdk({
  appId: 'YOUR_APP_ID',
  privateKey: 'YOUR_PRIVATE_KEY',
  alipayPublicKey: 'ALIPAY_PUBLIC_KEY'
});

const createOrder = async (ctx) => {
  const order = {
    out_trade_no: 'unique_order_no',
    product_code: 'FAST_INSTANT_TRADE_PAY',
    total_amount: '0.01',
    subject: 'test order'
  };

  const result = await alipaySdk.exec('alipay.trade.page.pay', {
    bizContent: order,
    returnUrl: 'http://yourwebsite.com/callback',
    notifyUrl: 'http://yourwebsite.com/notify'
  });

  ctx.redirect(result);
};

// 设置路由
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();

router.get('/create-order', createOrder);
app.use(router.routes());
app.listen(3000);

处理支付回调

const crypto = require('crypto');

const verifySignature = (params, sign) => {
  const signContent = Object.keys(params).sort().map(key => {
    if (key !== 'sign' && key !== 'sign_type' && params[key]) {
      return `${key}=${params[key]}`;
    }
    return '';
  }).join('&');

  const verifier = crypto.createVerify('RSA-SHA256');
  verifier.update(signContent, 'utf8');
  return verifier.verify('ALIPAY_PUBLIC_KEY', sign, 'base64');
};

const notify = async (ctx) => {
  const params = ctx.request.body;
  const sign = params.sign;
  delete params.sign;

  if (verifySignature(params, sign)) {
    // 验签成功,处理业务逻辑
    console.log('Payment successful:', params);
    ctx.body = 'success';
  } else {
    // 验签失败
    ctx.body = 'fail';
  }
};

router.post('/notify', notify);

Python实现

安装依赖

pip install alipay-sdk-python
pip install flask

创建支付请求

from flask import Flask, redirect, request
from alipay import AliPay

app = Flask(__name__)

alipay = AliPay(
    appid="YOUR_APP_ID",
    app_notify_url="http://yourwebsite.com/notify",
    app_private_key_string=open("path/to/your/private_key.pem").read(),
    alipay_public_key_string=open("path/to/alipay_public_key.pem").read()
)

@app.route('/create-order')
def create_order():
    order_string = alipay.api_alipay_trade_page_pay(
        out_trade_no="unique_order_no",
        total_amount="0.01",
        subject="test order",
        return_url="http://yourwebsite.com/callback"
    )
    return redirect("https://openapi.alipaydev.com/gateway.do?" + order_string)

if __name__ == '__main__':
    app.run(port=3000)

处理支付回调

import json
from flask import request, Flask

app = Flask(__name__)

@app.route('/notify', methods=['POST'])
def notify():
    data = request.form.to_dict()
    sign = data.pop('sign', None)
    success = alipay.verify(data, sign)

    if success:
        print("Payment successful:", data)
        return 'success'
    else:
        return 'fail'

if __name__ == '__main__':
    app.run(port=3000)

Java实现

安装依赖

在pom.xml中添加以下依赖:

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.11.0</version>
</dependency>

创建支付请求

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;

public class AlipayExample {
    public static void main(String[] args) throws Exception {
        AlipayClient alipayClient = new DefaultAlipayClient(
            "https://openapi.alipay.com/gateway.do",
            "YOUR_APP_ID",
            "YOUR_PRIVATE_KEY",
            "json",
            "UTF-8",
            "ALIPAY_PUBLIC_KEY",
            "RSA2"
        );

        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl("http://yourwebsite.com/callback");
        request.setNotifyUrl("http://yourwebsite.com/notify");

        request.setBizContent("{\"out_trade_no\":\"unique_order_no\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\","
                + "\"total_amount\":\"0.01\","
                + "\"subject\":\"test order\"}");

        AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
        if (response.isSuccess()) {
            System.out.println("Call succeeded, redirect to payment page.");
        } else {
            System.out.println("Call failed.");
        }
    }
}

处理支付回调

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.alipay.api.internal.util.AlipaySignature;

public class NotifyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String, String> params = new HashMap<>();
        Map<String, String[]> requestParams = req.getParameterMap();
        for (String name : requestParams.keySet()) {
            params.put(name, requestParams.get(name)[0]);
        }

        try {
            boolean flag = AlipaySignature.rsaCheckV1(
                params, 
                "ALIPAY_PUBLIC_KEY", 
                "UTF-8", 
                "RSA2"
            );

            if (flag) {
                System.out.println("Payment successful:" + params);
                resp.getWriter().write("success");
            } else {
                resp.getWriter().write("fail");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

通过上述步骤,您可以在不同的编程语言中实现支付宝支付功能,并处理支付回调。每种语言的实现逻辑基本相同,主要区别在于SDK的使用和请求/响应的处理方式。希望这篇文章能对您有所帮助!

读完了?给作者一点支持

本文采用 CC BY 4.0 协议转载 · © 大苹果

评论(0)

登录 后参与评论。

  • 还没有评论,来抢沙发。

🔗 相关文章

Mysql 表被标记为崩溃,最后一次自动化修复失败

当 MySQL 日志中出现“表被标记为崩溃且自动修复失败”的提示时,通常表示 MySQL 在启动过程中检测到某个表的文件系统或存储引擎层出现了问题。这种情况通常会导致表无法正常使用,需要手动进行修复。以下是处理这种情况的一些步骤和方法: ### 1. **查看具体错误信息** 首先,需要查看 MySQL 错误日志以获取更多的错误信息。这可以帮助确定崩溃的表和具体的问题。 ```bash # 查看 MySQL 错误日志 tail -f /var/log/mysql/error.log ``` ### 2. **修复表** 不同的存储引擎有不同的修复工具,以下是常用的修复方法: #### **使用 `myisamchk` 修复 MyISAM 表** 如果崩溃的表使用的是 MyISAM 存储引擎,可以使用 `myisamchk` 工具来修复表。 1. 停止 MySQL 服务: ```bash sudo systemctl stop mysql ``` 2. 使用 `myisamchk` 修复表:

2024/8/11👍 0

mermaid.min.js的使用及介绍

`mermaid.min.js` 是一个 JavaScript 库,用于在浏览器中轻松绘制复杂的图表和流程图。Mermaid 通过使用简单的标记语言来描述图表,使得用户无需深入学习图表绘制的底层技术即可创建专业的图形。 在这篇文章中,我们将介绍 `mermaid.min.js` 的功能、应用场景、如何在项目中使用,以及一些常用的示例。 ## Mermaid 的功能 Mermaid 支持多种类型的图表,包括但不限于: 1. **流程图(Flowchart)**: - 用于表示流程或过程中的步骤。 - 支持各种节点和连线风格。 2. **序列图(Sequence Diagram)**: - 用于表示对象之间的交互。 - 展示消息的发送和接收过程。 3. **类图(Class Diagram)**: - 用于表示类及其关系。 - 支持类的属性和方法定义。 4. **状态图(State Diagram)**: - 用于描述系统状态及其转换。 - 适用于复杂的状态机建模。 5. **甘

2024/8/9👍 0

docker之Dockerfile及docker compose配置文件的说明及使用

Docker 的配置文件对于镜像构建和容器化应用的管理至关重要。在 Docker 中,主要的配置文件是 Dockerfile 和 docker-compose.yml。Dockerfile 用于构建镜像,而 docker-compose.yml 用于定义多容器应用。下面将详细介绍这两个文件的配置选项和用法。 ## Dockerfile 配置详解 **Dockerfile** 是一个文本文件,其中包含一组指令,用于定义如何构建 Docker 镜像。以下是 Dockerfile 中常用的指令及其用法: ### FROM `FROM` 指令用于指定基础镜像,是 Dockerfile 中的第一条指令。 ```dockerfile FROM node:14 ``` 上例中,`node:14` 是官方的 Node.js 版本 14 的镜像。 ### LABEL `LABEL` 用于为镜像添加元数据,以键值对形式存在。 ```dockerfile LABEL maintainer="your-email@example.com" LABE

2024/8/9👍 0