通過(guò)云開發(fā)完成微信支付

新建云函數(shù)pay,下圖是其文件列表


image.png

安裝依賴


image.png

右鍵單擊云函數(shù)患久,在終端中打開蒋失,出現(xiàn)cmd窗口桐玻,npm install --save request
依次安裝好如上圖所示依賴

index.js

// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')
cloud.init()
var wechat=require("./wechat_config.js")
var body_data=require("./body_data.js")
var non_str_random=require("./non_str_random.js")
var cryptoMO=require("crypto")
var request = require('request'); 
var xml2js = require('xml2js'); 
var xmlParser = new xml2js.Parser({ explicitArray: false, ignoreAttrs: true })
var out_trade_no = Date.parse(new Date()); 
var non_str = non_str_random();
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
  var payBody="fee"
  const wxContext = cloud.getWXContext()
  let obj = {
    appid: wechat.appid,
    mch_id: wechat.mch_id,
    nonce_str: non_str,
    body: payBody,
    out_trade_no: out_trade_no,
    total_fee: event.total_fee,
    spbill_create_ip: wechat.ip,
    notify_url: wechat.notify_url,
    trade_type: 'JSAPI',
    openid: event.openid
  }
  let arr = Object.keys(obj).sort().map(item => {
    return `${item}=${obj[item]}`;
  });
  // 這里拼接簽名字符串的時(shí)候一定要注意: 商戶的key是要單獨(dú)拿出來(lái)拼在最后面的
  let str = arr.join('&') + '&key=' + wechat.key;
//上下兩種生成str的方法都可以
  // var str = `appid=${wechat.appid}&body=${payBody}&mch_id=${wechat.mch_id}&nonce_str=${non_str}&notify_url=${wechat.notify_url}&openid=${event.openid}&out_trade_no=${out_trade_no}&spbill_create_ip=${wechat.ip}&total_fee=${event.total_fee}&trade_type=JSAPI&key=${wechat.key}`;
  var sign = cryptoMO.createHash('md5').update(str).digest('hex');
  var temp_body_data = body_data(wechat, payBody, non_str, event.openid, out_trade_no, event.total_fee, sign);
  return new Promise((resolve, reject) => request({ 
    url: wechat.url, 
    method: 'POST', 
    body: temp_body_data 
  }, (err, res, body) => {
    
    xmlParser.parseString(body, (err, res) => {
      var prepay_id = res.xml.prepay_id;
      var str = `appId=${wechat.appid}&nonceStr=${non_str}&package=prepay_id=${prepay_id}&signType=MD5&timeStamp=${out_trade_no}&key=${wechat.key}`;
      var paySign = cryptoMO.createHash('md5').update(str).digest('hex'); 
      return resolve({ 
        success: true, 
        data: { 
          timeStamp: out_trade_no.toString(), 
          nonceStr: non_str, 
          package: `prepay_id=${prepay_id}`, 
          paySign: paySign, 
          outTradeNo: out_trade_no 
          } 
      });
    })
  }))
}

      



body_data.js

function bodyData(wechat,payBody,non_str,openid,out_trade_no,total_fee,sign){
  var formData='<xml>'
  formData += "<appid>" + wechat.appid + "</appid>"; //appid
  formData += "<body>" + payBody + "</body>";
  formData += "<mch_id>" + wechat.mch_id + "</mch_id>"; //商戶號(hào)
  formData += "<nonce_str>" + non_str + "</nonce_str>";
  formData += "<openid>" + openid + "</openid>";
  formData += "<notify_url>" + wechat.notify_url + "</notify_url>";
  formData += "<out_trade_no>" + out_trade_no + "</out_trade_no>";
  formData += "<spbill_create_ip>" + "127.0.0.1" + "</spbill_create_ip>";
  formData += "<total_fee>" + total_fee + "</total_fee>";
  formData += "<trade_type>JSAPI</trade_type>";
  formData += "<sign>" + sign.toUpperCase() + "</sign>";
  formData += "</xml>";
  return formData;
}
module.exports=bodyData

wechat_config.js

var wechat={
  appid: '########',
  mch_id: '###########',  //商戶ID
  ip:'127.0.0.1',                  //終端IP铣卡,貌似隨便寫也沒(méi)啥問(wèn)題
  notify_url:'https://www.baidu.com/',  //回調(diào)地址煮落,便于接收微信支付返回的結(jié)果,隨便寫
  key:'############',       //api KEY
  url:'https://api.mch.weixin.qq.com/pay/unifiedorder'  //請(qǐng)求地址蝉仇,文檔上有
}
module.exports=wechat;

non_str_random.js

生成隨機(jī)字符串函數(shù)

function non_str(){
  var data=''
  var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
  for (var i = 0; i < 32; i++) {
    var id = Math.ceil(Math.random() * chars.length-1);
    data += chars[id];
  }
  return data;
}
module.exports=non_str

服務(wù)端寫好了褪子,接下來(lái)就是客戶端

在pages/index/index.js文件中調(diào)用云函數(shù),存儲(chǔ)openId

wx.cloud.callFunction({
      name: 'register',
      // 傳給云函數(shù)的參數(shù)
      complete: res => {
        app.globalData.openId = res.result.OPENID
        wx.setStorageSync('openid', res.result.OPENID)
      },
      fail: console.error
    })   

在需要微信支付的地方調(diào)用pay云函數(shù)

wx.cloud.callFunction({
    name: 'pay',
        data: {
          openid: wx.getStorageSync('openid'),
          total_fee: this.data.totalprice * 100
        },
        complete: res => {
          wx.requestPayment({
            timeStamp: res.result.data.timeStamp,
            nonceStr: res.result.data.nonceStr,
            package: res.result.data.package,
            signType: 'MD5',
            paySign: res.result.data.paySign,
          })
        }
      })

全部完成
剛開始呀枢,云函數(shù)一直返回簽名校驗(yàn)失敗裙秋,我利用官方校驗(yàn)工具卻是正確的琅拌,然后我就重新再運(yùn)行了一次进宝,結(jié)果又可以了,坑爹党晋,真的是看心情返回了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末未玻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扳剿,更是在濱河造成了極大的恐慌昼激,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧掺,死亡現(xiàn)場(chǎng)離奇詭異纷宇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)像捶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)释簿,“玉大人硼莽,你說(shuō)我怎么就攤上這事《遥” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵套像,是天一觀的道長(zhǎng)终息。 經(jīng)常有香客問(wèn)我贞让,道長(zhǎng)柳譬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任销部,我火速辦了婚禮制跟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凫岖。我一直安慰自己哥放,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布甥雕。 她就那樣靜靜地躺著胀茵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峭弟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天瞒瘸,我揣著相機(jī)與錄音熄浓,去河邊找鬼。 笑死俯在,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的跷乐。 我是一名探鬼主播石景,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼拙吉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揪荣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起佛舱,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挨决,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后脖祈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慎陵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年席纽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片润梯。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甥厦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刀疙,到底是詐尸還是另有隱情,我是刑警寧澤顿痪,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布油够,位于F島的核電站,受9級(jí)特大地震影響石咬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鬼悠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一亏娜、第九天 我趴在偏房一處隱蔽的房頂上張望维贺。 院中可真熱鬧,春花似錦溯泣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜻拨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間官觅,已是汗流浹背休涤。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工笛辟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人手幢。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像跺涤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桶错,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容