uniapp+nodejs實現小程序支付

1.準備商戶號、企業級小程序(或者個體工商戶級別的)

2.在小程序端調用uni.login獲取code,傳遞給后端

uni.login({success: loginRes => {uni.request({url: "http://127.0.0.1:3003/wxpay/pay",data: {code: loginRes.code},method: "get",success: res => {},fail: err => {}})}})

3.在nodejs端,

let express = require("express");
let router = express.Router();
const WxPay = require('wechatpay-node-v3');
const fs = require('fs');
let api = require("../api/index");
var path = require('path');
let weixinData = require('../utils/weixinData');
const qs = require('querystring')//根據code查找openid
function getOpenid(code){return new Promise((resolve, reject) => {let appid = weixinData.Appidlet secret = weixinData.AppSecretlet params = {appid,secret,js_code:code}let formData = qs.stringify(params)let openIdUrl = "https://api.weixin.qq.com/sns/jscode2session?" + formData + "&grant_type=authorization_code"api.get(openIdUrl).then( res => {resolve(res.data.openid)})})
}// 創建支付實例
const pay = new WxPay({appid: 'wx9fc72986dc9287b6',mchid: '1674432158',publicKey: fs.readFileSync(path.resolve(__dirname, 'apiclient_cert.pem')), // 公鑰privateKey: fs.readFileSync(path.resolve(__dirname, 'apiclient_key.pem')), // 秘鑰key: 'zlc010903zlc010903zlc010903wcpwc'
});// 訂單號生成函數
function randomNumber() {const now = new Date()let month = now.getMonth() + 1let day = now.getDate()let hour = now.getHours()let minutes = now.getMinutes()let seconds = now.getSeconds()month = month < 10 ? "0" + month : month;day = day < 10 ? "0" + day : day;hour = hour < 10 ? "0" + hour : hour;minutes = minutes < 10 ? "0" + minutes : minutes;seconds = seconds < 10 ? "0" + seconds : seconds;let orderCode = now.getFullYear().toString() + month.toString() + day + hour + minutes + seconds + (Math.round(Math.random() * 1000000)).toString();return orderCode;
}let notify = async (req, res) => {// 申請的APIv3let key = 'zlc010903zlc010903zlc010903wcpwc';let { ciphertext, associated_data, nonce } = req.body.resource;// 解密回調信息const result = pay.decipher_gcm(ciphertext, associated_data, nonce, key);// 拿到訂單號let { out_trade_no } = result;if (result.trade_state == 'SUCCESS') {// 支付成功之后需要進行的業務邏輯console.log('支付成功')}
}// 拿到支付所需參數
let payInfo = (req, res) => {let { code } = req.query//獲取openidgetOpenid(code).then(async resolve => {const params = {mchid: '1674432158',description: '支付測試', // 訂單描述out_trade_no: randomNumber(), // 訂單號,一般每次發起支付都要不一樣,可使用隨機數生成notify_url: 'http://127.0.0.1:3003/wxpay/notify_url',amount: {total: 1, // 支付金額,單位為分currency: 'CNY'},payer: {openid: resolve, // 微信小程序用戶的openid,一般需要前端發送過來},scene_info: {payer_client_ip: 'ip', // 支付者ip,這個不用理會也沒有問題},};const result = await pay.transactions_jsapi(params);// 將結果響應給微信小程序前端res.send(result);})}// 回調路由
router.post('/notify_url', notify)
router.get('/pay', payInfo);
module.exports = router

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41203.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RedHat9 | kickstart無人值守批量安裝

一、知識補充 kickstart Kickstart是一種用于Linux系統安裝的自動化工具&#xff0c;它通過一個名為ks.cfg的配置文件來定義Linux安裝過程中的各種參數和設置。 kickstart的工作原理 Kickstart的工作原理是通過記錄典型的安裝過程中所需人工干預填寫的各種參數&#xff0c;…

漏洞分析 | PHP CGI Windows平臺遠程代碼執行漏洞(CVE-2024-4577)

漏洞概述 PHP CGI&#xff08;Common Gateway Interface&#xff09;是在Windows平臺上運行PHP的一種方式。CGI是一種標準接口&#xff0c;允許Web服務器與外部應用程序&#xff08;如PHP腳本&#xff09;進行交互&#xff0c;從而生成動態網頁內容。 近期&#xff0c;PHP發布…

Request safe_get 小工具

接口安全獲取請求參數小工具&#xff08; python&#xff09; flask import logging import traceback from flask import (Blueprint, request, Response, jsonify, g, send_file)def safe_get(req: request, attr: str, defaultNone):try:if attr in req.form:return req.f…

拍攝泡咖啡的劇本!

泡咖啡的過程可以是一種放松和享受的儀式&#xff0c;同時也是一個記錄生活美好瞬間的好機會。以下是一些步驟和提示&#xff0c;幫助您記錄泡咖啡的過程&#xff1a; 1. **準備材料**&#xff1a; 確保您有新鮮的咖啡豆、磨豆機、咖啡壺、濾紙、熱水和杯子。 2. **選擇音樂**&…

Logstash安裝插件失敗的問題

Logstash安裝插件失敗的問題 安裝 logstash-output-jdbc 失敗 報錯為&#xff1a; Unable to download data from https://rubygems.org - Net::OpenTimeout: Failed to open TCP connection to rubygems.org:443 (execution expired) (https://rubygems.org/latest_specs.4.…

【算法 - 哈希表】兩數之和

這里寫自定義目錄標題 兩數之和題目解析思路解法一 &#xff1a;暴力枚舉 依次遍歷解法二 &#xff1a;使用哈希表來做優化 核心邏輯為什么之前的暴力枚舉策略不太好用了&#xff1f;所以&#xff0c;這就是 這道題選擇 固定一個數&#xff0c;再與其前面的數逐一對比完后&…

Linux系統(CentOS)安裝iptables防火墻

1&#xff0c;先檢查是否安裝了iptables 檢查安裝文件-執行命令&#xff1a;rpm -qa|grep iptables 檢查安裝文件-執行命令&#xff1a;service iptables status 2&#xff0c;如果安裝了就卸裝(iptables-1.4.21-35.el7.x86_64 是上面命令查出來的版本) 執行命令&#xff1a…

藍牙信標和藍牙標簽我們如何區分,區分方法有哪些?

藍牙信標和藍牙標簽其實是兩種不同的技術&#xff0c;很多人可能會把藍牙信標和藍牙標簽搞混&#xff0c;因為區分不開來&#xff0c;但實際上&#xff0c;區分這兩種技術也很簡單&#xff0c;因為它們各自都有不一樣的特性&#xff0c;通過這些特性&#xff0c;我們也能正常區…

相機光學(二十四)——CRA角度

CRA角度 0.參考資料1.什么是CRA角度2.為什么 CRA 會導致luma shading3.為什么 CRA 會導致color shading4.CRA相差過大的具體表現5.CRA Matching6.怎樣選擇sensor的CRA 0.參考資料 1.芯片CRA角度與鏡頭的匹配關系&#xff08;一&#xff09; ??2.芯片CRA角度與鏡頭選型的匹配關…

爬蟲進階:Selenium與Ajax的無縫集成

爬蟲與Ajax的挑戰 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;允許網頁在不重新加載整個頁面的情況下與服務器交換數據并更新部分內容。這為用戶帶來了更好的體驗&#xff0c;但同時也使得爬蟲在抓取數據時面臨以下挑戰&#xff1a; 動態內容加載&#xff…

go語言 函數和包

go語言 函數和包 一、函數 在Go語言中&#xff0c;函數是執行特定任務的自包含代碼塊。 1.函數的定義 函數通過func關鍵字定義&#xff0c;格式如下&#xff1a; func 函數名(形參 形參類型, 形參 形參類型) 返回值類型 {函數體return 返回值 }2.基礎函數類型 無參數無返回…

vue中數組出現__ob__: Observer屬性,導致不能正確使用問題解決

直接上圖&#xff0c;如下圖&#xff0c;數組中出現__ob__: Observer屬性&#xff0c;導致無法取值。 解決方案為&#xff1a;JSON.parse(JSON.stringify(數組變量名))深拷貝數組&#xff0c;重新生成一個可枚舉數組。 // 處理代碼如let tempIds JSON.parse(JSON.stringify(i…

一文帶你初探FreeRTOS信號量

本文記錄我初步學習FreeRTOS的信號量的知識&#xff0c;在此記錄分享&#xff0c;希望我的分享對你有所幫助&#xff01; 什么是信號量 在FreeRTOS中&#xff0c;信號量&#xff08;Semaphore&#xff09;是一種用于任務間同步和資源共享的機制。信號量主要用于管理對共享資源的…

Cgi上傳文件 注意事項

//核心代碼 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //錯誤方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 參考博客&#xff1a; https://blog.cs…

GNU/Linux - 各種包管理器介紹

Linux 包管理器根據不同的發行版和包管理系統有所不同。以下是一些常見的 Linux 包管理器&#xff1a; 1. RPM (Red Hat Package Manager) * 用于&#xff1a; Red Hat Enterprise Linux (RHEL), Fedora, CentOS, openSUSE * 包管理器&#xff1a; rpm, yum, dnf 2. DEB (Deb…

HTML如何在圖片上添加文字

HTML如何在圖片上添加文字 當我們開發一個頁面&#xff0c;插入圖片時&#xff0c;需要有一組文字對圖片進行描述。那么HTML中如何在圖片上添加文字呢&#xff1f;這篇文章告訴你。 先讓我們來看下效果圖&#xff1a; 句子“這是一張夜空圖片”被放置在了圖片的左下角。 那么…

Leetcode.342 4的冪

給定一個整數&#xff0c;寫一個函數來判斷它是否是 4 的冪次方。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 整數 n 是 4 的冪次方需滿足&#xff1a;存在整數 x 使得 n 4x 示例 1&#xff1a; 輸入&#xff1a;n 16 輸出&#xff1a;true示…

微信小程序的智慧物流平臺-計算機畢業設計源碼49796

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3研究方法 1.4開發技術 1.4.1 微信開發者工具 1.4.2 Node.JS框架 1.4.3 MySQL數據庫 1.5論文結構與章節安排 2系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 用戶登錄流程 2.2.2 數據刪除流程 2.3 系統功能分…

C#面:ASP.NET Core Filter如何?持依賴注??

ASP.NET Core Filter可以通過依賴注入來支持。在ASP.NET Core中&#xff0c;依賴注入是一種將依賴對象提供給類的機制&#xff0c;它可以幫助我們解耦和測試代碼。 要在ASP.NET Core Filter中使用依賴注入&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;…

ESP32CAM物聯網教學09

ESP32CAM物聯網教學09 攝像頭配上顯示屏 小智給攝像頭配上了一塊液晶顯示屏,ESP32Cam變得更加酷炫了,應用也更加廣泛了。 TFT彩色顯示屏從第一課的CameraWebServer開始,我們一直都是利用瀏覽器來查看顯示攝像頭的視頻流,都需要借助這個網頁提供的服務。 可以讓ESP32Cam開…