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

person 无限可能    watch_later 2024-07-11 11:17:58
visibility 142    class 支付宝,支付,java,NodeJs,Python    bookmark 分享

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

在这篇文章中,我们将展示如何在多个编程语言中实现支付宝支付功能,并处理支付回调。我们将覆盖以下几种语言: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的使用和请求/响应的处理方式。希望这篇文章能对您有所帮助!

评论区
评论列表
menu