通过云开发完成微信支付

新建云函数pay,下图是其文件列表


image.png

安装依赖


image.png

右键单击云函数,在终端中打开,出现cmd窗口,npm install --save request
依次安装好如上图所示依赖

index.js

// 云函数入口文件
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();
// 云函数入口函数
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]}`;
  });
  // 这里拼接签名字符串的时候一定要注意: 商户的key是要单独拿出来拼在最后面的
  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>"; //商户号
  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,貌似随便写也没啥问题
  notify_url:'https://www.baidu.com/',  //回调地址,便于接收微信支付返回的结果,随便写
  key:'############',       //api KEY
  url:'https://api.mch.weixin.qq.com/pay/unifiedorder'  //请求地址,文档上有
}
module.exports=wechat;

non_str_random.js

生成随机字符串函数

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

服务端写好了,接下来就是客户端

在pages/index/index.js文件中调用云函数,存储openId

wx.cloud.callFunction({
      name: 'register',
      // 传给云函数的参数
      complete: res => {
        app.globalData.openId = res.result.OPENID
        wx.setStorageSync('openid', res.result.OPENID)
      },
      fail: console.error
    })   

在需要微信支付的地方调用pay云函数

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,
          })
        }
      })

全部完成
刚开始,云函数一直返回签名校验失败,我利用官方校验工具却是正确的,然后我就重新再运行了一次,结果又可以了,坑爹,真的是看心情返回了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容