Node實現支付寶網頁支付流程(沙箱環境)

支付寶PC端支付接口流程

    1、前端點擊支付按鈕,向後端發起一個ajax請求(get請求,帶order_id)

    2、後端收到order_id,根據支付寶的規則生成支付的url,返回前端

    3、ajax收到成功的響應,從響應中取出url,並向這個url發起請求

    4、支付寶的服務器收到請求,返回一個支付頁面

    5、買家登錄賬號或掃碼進行支付

    6、支付寶回調前端的success頁面(訪問前端的http://127.0.0.1:8080/success?xxx=xx&yy=yy),

這時請求中會攜帶本次支付結果的相關信息

    7、這個success頁面獲取請求中攜帶的參數,同時採用ajax的方式向後端發起get請求,攜帶獲取的參數

    8、後端驗證支付結果,修改訂單狀態,返回success頁面需要的data數據

    9、success頁面加載數據,展示支付結果

    10、爲了防止用戶在支付之後將頁面關掉,支付寶服務器會再隔一段時間向後端發送一個攜帶支付結果的post請求,

以保證後端能拿到結果,修改訂單狀態。

一、登錄支付寶開放平臺,並進入沙箱環境

1.登錄

2.進入我的控制檯

3.進入開發者中心

4.點擊研發服務,進入沙箱環境

PS:若您只是用於個人項目演示,千萬不要選擇“我的應用”裏的“創建應用”,創建完成後(並且審覈通過後),產品簽約是需要營業執照的,並且應用一旦上線,是無法刪除的;

二、創建Node項目

這裏使用的是Egg.js

直接使用腳手架,即可快速生成項目

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i

三、Coding

(1) 設置RSA2密鑰

1.1 下載支付寶密鑰生成器

1.2 選擇密鑰格式和長度後,生成密鑰

1.3 將生成的公鑰填入到沙箱環境的RSA2中

1.4 保存後點擊查看,支付寶公鑰

(2)Coding

2.1  創建app/controller/alipay.js 和 config/pem/

 

config/pem/alipay_public_key.pem : 支付寶公鑰

config/pem/public_key.pem : 應用公鑰

config/pem/private_key.pem : 應用私鑰


【注意】將支付寶公鑰 alipay_public_key.pem,將上述生成的字符串添加到該文件,並且字符串前後加上祕鑰所需描述:“-----BEGIN PUBLIC KEY-----”、“-----END PUBLIC KEY-----”

2.2 router.js

"use strict";

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  router.get("/", controller.home.index);
  router.get("/alipay", controller.alipay.index);
};

2.3 alipay.js

"use strict";

const fs = require("fs");
const path = require("path");

const AlipaySDK = require("alipay-sdk").default;
const AlipayFormData = require("alipay-sdk/lib/form").default;

const Controller = require("egg").Controller;

class AlipayController extends Controller {
  async index() {
    const { ctx } = this;

    const alipaySdk = new AlipaySDK({
      appId: "2**********9", // 你自己的沙箱黃環境的appId
      privateKey: fs.readFileSync(
        path.join(__dirname, "../../config/pem/app_private_key.pem"),
        "ascii"
      ), // 私鑰
      signType: "RSA2", // 簽名類型
      alipayPublicKey: fs.readFileSync(
        path.join(__dirname, "../../config/pem/alipay_public_key.pem"),
        "ascii"
      ), // 支付寶公鑰(不是應用公鑰)
      gateway: "https://openapi.alipaydev.com/gateway.do", // 網關地址
      timeout: 5000, // 網關超時時間
      camelcase: true // 是否把網關返回的下劃線 key 轉換爲駝峯寫法
    });
    /**
     * 返回支付鏈接(PC支付接口)
     */
    const formData = new AlipayFormData();
    formData.setMethod("get");
    formData.addField("appId", "2**************9");
    formData.addField("charset", "utf-8");
    formData.addField("signType", "RSA2");
    formData.addField("bizContent", {
      outTradeNo: "1569380127322",// 【必選】商戶訂單號:64個字符內,包含數字,字母,下劃線;需要保證在商戶端不重複
      productCode: "FAST_INSTANT_TRADE_PAY",// 【必選】銷售產品碼,目前僅支持FAST_INSTANT_TRADE_PAY
      totalAmount: "0.01",// 【必選】訂單總金額,精確到小數點後兩位
      subject: "test",// 【必選】 訂單標題
      body: "test" // 【可選】訂單描述
    });
    /**
     * exec對應參數:
     * method(調用支付寶api)
     * params(api請求的參數(包含“公共請求參數”和“業務參數”))
     * options(validateSign,formData,log)
     */

    const result = await alipaySdk.exec(
      "alipay.trade.page.pay",
      {},
      { formData }
    );
    console.log(result); // result爲可以跳轉到支付連接的url
    ctx.body = result;
  }
}

module.exports = AlipayController;

業務參數

2.4 運行項目

npm run dev

打開 http://127.0.0.1:7001/alipay ,將 result 的結果的鏈接打開,就可以支付嘍

PS:下載沙箱環境裏的沙箱版支付寶,登錄買家賬號,進行支付


Vue node.js實現支付寶支付(沙箱測試)

螞蟻金服開放平臺 node sdk

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章