日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

【全网唯一】全网唯一能够跑通的,跑不通你来找我~用node.js完成微信支付下单功能,且只需要一个文件wxpay.js就解决业务流程的node.js程序

發(fā)布時(shí)間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【全网唯一】全网唯一能够跑通的,跑不通你来找我~用node.js完成微信支付下单功能,且只需要一个文件wxpay.js就解决业务流程的node.js程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?

先吐為敬!

?

最近心血來(lái)潮研究nodejs如何完成微信支付功能,結(jié)果網(wǎng)上一搜索,一大堆“代碼拷貝黨”、“留一手”、“缺斤少兩”、“不說(shuō)人話”、“自己都沒(méi)跑通還出來(lái)發(fā)blog”、“各種缺少依賴包”、“各種注釋都沒(méi)有”、“自己都不知道在寫(xiě)什么”的程序大神紛紛為了增加自己博客一個(gè)帖子的名額而發(fā)布了各種千奇百怪的文章,強(qiáng)哥飽受煎熬,浪費(fèi)了流量和時(shí)間居然沒(méi)有一個(gè)教程能夠跑通

叔可忍嬸不可忍,我必須要發(fā)布一篇真正能夠用nodejs跑通微信支付功能的干貨文章,由于時(shí)間關(guān)系,錯(cuò)別字大家就諒解,反正程序能夠跑通,跑不通你來(lái)找我!!!

注意,前情提示:
本代碼基于《Node.js(nodejs)對(duì)本地JSON文件進(jìn)行增、刪、改、查操作(輕車熟路)》
傳送門(mén)Node.js(nodejs)對(duì)本地JSON文件進(jìn)行增、刪、改、查操作(輕車熟路)_你摯愛(ài)的強(qiáng)哥?給你發(fā)來(lái)1條消息?-CSDN博客

首先要去package.json加入依賴包

"dependencies": {"crypto": "^1.0.1","express": "^4.16.3","request": "^2.85.0","xmlreader": "^0.2.3"},

在/api/文件夾下面創(chuàng)建wxpay.js?

代碼內(nèi)容

/**做微信支付開(kāi)發(fā)之前一定要修改的配置,各位看官看清楚了◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
const appid = "wx你摯愛(ài)的強(qiáng)哥";//公眾號(hào)開(kāi)發(fā)者ID[必填,公眾號(hào)后臺(tái)去拿https://mp.weixin.qq.com/ 開(kāi)發(fā)-基本配置-公眾號(hào)開(kāi)發(fā)信息-開(kāi)發(fā)者ID(AppID)]
const appsecret = "a071e61你摯愛(ài)的強(qiáng)哥9efc7a";//公眾號(hào)開(kāi)發(fā)者密碼[必填,公眾號(hào)后臺(tái)去拿https://mp.weixin.qq.com/ 開(kāi)發(fā)-基本配置-公眾號(hào)開(kāi)發(fā)信息-開(kāi)發(fā)者密碼(AppSecret)]
const mchid = "16你摯愛(ài)的強(qiáng)哥3";//微信商戶號(hào)[必填,微信商戶平臺(tái)去拿https://pay.weixin.qq.com/ 個(gè)人信息-賬號(hào)信息-登錄賬號(hào)]
const mchkey = "你摯愛(ài)的強(qiáng)哥32位秘鑰";//微信支付安全密鑰[必填, 在微信商戶平臺(tái)-賬戶中心-API安全-API密鑰-安裝操作證書(shū)(首次設(shè)置才需要)-設(shè)置API密鑰(注意這個(gè)密鑰自己保存好勿外傳!!!)]
const notify_url = "http://你摯愛(ài)的強(qiáng)哥.com";//異步接收微信支付結(jié)果通知的回調(diào)地址,通知url必須為外網(wǎng)可訪問(wèn)的url,不能攜帶參數(shù)。
/**◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*///下面的代碼幾乎不用修改----------------------------------------------------------------
//如果運(yùn)行過(guò)程提示你“商戶號(hào)該產(chǎn)品權(quán)限未開(kāi)通,請(qǐng)前往商戶平臺(tái)>產(chǎn)品中心檢查后重試”,請(qǐng)你去這里https://pay.weixin.qq.com/index.php/public/product/detail?pid=32&productType=0開(kāi)通微信H5支付(這個(gè)一般審核要幾個(gè)工作日,如果你的項(xiàng)目很急,建議早點(diǎn)來(lái)開(kāi)通審核)
const $g = global.SG.$g, fs = global.SG.fs, router = global.SG.router, request = global.SG.request, xmlreader = global.SG.xmlreader;
module.exports = global.SG.router;
/*微信支付干貨,微信統(tǒng)一下單幫助文檔
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1*/
//強(qiáng)哥為你量身打造的微信支付方法工具包
let sgWxpay = {signType: "MD5",//簽名類型,默認(rèn)為MD5,支持HMAC-SHA256和MD5。注意此處需與統(tǒng)一下單的簽名類型一致raw(args) {let keys = Object.keys(args);keys = keys.sort();let newArgs = {};keys.forEach(key => {newArgs[key] = args[key];});let string = "";for (let k in newArgs) {string += "&" + k + "=" + newArgs[k];}string = string.substr(1);return string;},//把金額轉(zhuǎn)為分getmoney(money) {return parseFloat(money) * 100;},// 隨機(jī)字符串產(chǎn)生函數(shù)createNonceStr() {return Math.random().toString(36).substr(2, 15);},// 時(shí)間戳產(chǎn)生函數(shù)createTimeStamp() {return parseInt(new Date().getTime() / 1000) + "";},//簽名加密算法paysignjsapi(appid, body, mch_id, nonce_str, notify_url, out_trade_no, spbill_create_ip, total_fee, trade_type, mchkey) {let ret = {appid: appid,mch_id: mch_id,nonce_str: nonce_str,body: body,notify_url: notify_url,out_trade_no: out_trade_no,spbill_create_ip: spbill_create_ip,total_fee: total_fee,trade_type: trade_type};let string = this.raw(ret);let key = mchkey;string = string + "&key=" + key;return global.SG.crypto.createHash(this.signType).update(string, "utf8").digest("hex").toUpperCase();},//簽名加密算法,第二次的簽名paysignjsapifinal(appid, mch_id, prepayid, noncestr, timestamp, mchkey) {let ret = {appid: appid,partnerid: mch_id,prepayid: prepayid,package: "Sign=WXPay",noncestr: noncestr,timestamp: timestamp};let string = this.raw(ret), key = mchkey;string = string + "&key=" + key;return global.SG.crypto.createHash(this.signType).update(string, "utf8").digest("hex").toUpperCase();},getXMLNodeValue(xml) {// let tmp = xml.split("<"+node_name+">");// console.log('tmp',tmp);// let _tmp = tmp[1].split("</"+node_name+">");// console.log('_tmp',_tmp);// return _tmp[0];xmlreader.read(xml, (errors, res) => {if (null !== errors) {console.log(errors);return;}console.log("長(zhǎng)度===", res.xml.prepay_id.text().length);let prepay_id = res.xml.prepay_id.text();console.log("解析后的prepay_id==", prepay_id);return prepay_id;});}
};
//微信支付(all方法支持POST、GET、PUT、PATCH、DELETE傳參方式)
router.all("/demo/wx/wxpay", (req, res) => {//首先拿到前端傳過(guò)來(lái)的參數(shù)let out_trade_no = req.body.out_trade_no || req.query.out_trade_no;//商戶系統(tǒng)內(nèi)部訂單號(hào),要求32個(gè)字符內(nèi),只能是數(shù)字、大小寫(xiě)字母_-|* 且在同一個(gè)商戶號(hào)下唯一。詳見(jiàn)商戶訂單號(hào)let body = req.body.body || req.query.body;//商品簡(jiǎn)單描述,該字段請(qǐng)按照規(guī)范傳遞,具體請(qǐng)見(jiàn)參數(shù)規(guī)定https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2let total_fee = req.body.total_fee || req.query.total_fee;//準(zhǔn)備付款多少錢(qián)呀大哥?金額單位分(但是你的前端請(qǐng)傳元為單位,因?yàn)檫@里強(qiáng)哥幫你轉(zhuǎn)成了分)console.log($g.date.nowtime() + "\n", `商戶系統(tǒng)內(nèi)部訂單號(hào):${out_trade_no}\n商品描述:${body}\n標(biāo)價(jià)金額:${total_fee}\n${appid}\n${appsecret}\n${mchid}\n${mchkey}`);let msg = null;out_trade_no || (msg = "強(qiáng)哥對(duì)你說(shuō):你為什么不提供商品訂單號(hào)?");body || (msg = "強(qiáng)哥對(duì)你說(shuō):你為什么不提供商品描述?");total_fee || (msg = "強(qiáng)哥對(duì)你說(shuō):你為什么不提供商品訂單號(hào)?");if (msg) return $g.json.res(req, res, msg, req.body || req.query, false);//首先生成簽名signlet mch_id = mchid;let nonce_str = sgWxpay.createNonceStr();let timestamp = sgWxpay.createTimeStamp();total_fee = sgWxpay.getmoney(total_fee);//強(qiáng)哥為你轉(zhuǎn)換為分let spbill_create_ip = req.connection.remoteAddress;let trade_type = "APP";let sign = sgWxpay.paysignjsapi(appid, body, mch_id, nonce_str, notify_url, out_trade_no, spbill_create_ip, total_fee, trade_type, mchkey);// console.log("sign:", sign);//組裝xml數(shù)據(jù)body = "<xml>";body += "<appid>" + appid + "</appid>";//appidbody += "<body><![CDATA[" + "測(cè)試微信支付" + "]]></body>";body += "<mch_id>" + mch_id + "</mch_id>";//商戶號(hào)body += "<nonce_str>" + nonce_str + "</nonce_str>"; //隨機(jī)字符串,不長(zhǎng)于32位。body += "<notify_url>" + notify_url + "</notify_url>";body += "<out_trade_no>" + out_trade_no + "</out_trade_no>";body += "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>";body += "<total_fee>" + total_fee + "</total_fee>";body += "<trade_type>" + trade_type + "</trade_type>";body += "<sign>" + sign + "</sign>";body += "</xml>";const url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//下單地址// const url = "https://api2.mch.weixin.qq.com/pay/unifiedorder";//冗災(zāi)備用域名,正常使用主域名調(diào)用,備域名需有流量,保證業(yè)務(wù)能實(shí)時(shí)切換。當(dāng)域名出現(xiàn)請(qǐng)求超時(shí)、讀寫(xiě)超時(shí),自動(dòng)換備域名重試。request.post({url, body}, (err, r, body) => {if (!err && r.statusCode == 200) {console.log("body:", body);xmlreader.read(body.toString("utf-8"), (err, r) => {if (err) return $g.json.res(req, res, "微信下單報(bào)錯(cuò)", err, false);let prepay_id = r.xml.prepay_id;if (!prepay_id) return $g.json.res(req, res, r.xml.return_msg.text(), r.xml, false);prepay_id = prepay_id.prepay_id.text();console.log("解析后的prepay_id", prepay_id);let finalsign = sgWxpay.paysignjsapifinal(appid, mch_id, prepay_id, nonce_str, timestamp, mchkey);//將預(yù)支付訂單和其他信息一起簽名后返回給前端$g.json.res(req, res, "微信下單成功", {// mchid: mchid,//商戶ID(喚起支付貌似不需要這個(gè))// prepayId: prepay_id,appId: appid,//商戶注冊(cè)具有支付權(quán)限的公眾號(hào)成功后即可獲得timeStamp: timestamp,//當(dāng)前的時(shí)間,其他詳見(jiàn)時(shí)間戳規(guī)則https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2nonceStr: nonce_str,//隨機(jī)字符串,不長(zhǎng)于32位。推薦隨機(jī)數(shù)生成算法https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3package: "prepay_id=sgWxPay",//統(tǒng)一下單接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=***signType: sgWxpay.signType,//簽名類型,默認(rèn)為MD5,支持HMAC-SHA256和MD5。注意此處需與統(tǒng)一下單的簽名類型一致paySign: finalsign//簽名,詳見(jiàn)簽名生成算法https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3}, true);});}});
});

在index.js最后一行加入

app.use(API_PATH, require(`.${API_PATH}/demo/wxpay`));//微信支付

運(yùn)行

node index

?打完收工!

總結(jié)

以上是生活随笔為你收集整理的【全网唯一】全网唯一能够跑通的,跑不通你来找我~用node.js完成微信支付下单功能,且只需要一个文件wxpay.js就解决业务流程的node.js程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。