美文网首页
通过云开发完成微信支付

通过云开发完成微信支付

作者: 真是个非常帅气的昵称呢 | 来源:发表于2019-04-15 10:13 被阅读0次

新建云函数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,
          })
        }
      })

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

相关文章

  • 通过云开发完成微信支付

    新建云函数pay,下图是其文件列表 安装依赖 index.js body_data.js wechat_confi...

  • 基于新版云开发的微信支付

    微信终于发布了基于云开发的微信支付,相比于原来的支付方式,新版的云开发版支付支持云函数形式的回调。网上查资料后发现...

  • 微信APP支付接入

    【申请流程】 开发微信APP支付,需要先去微信开放平台申请移动应用,并开通微信支付功能,通过审核后方可进行开发; ...

  • 微信支付集成文档

    一、开发前提 APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式...

  • JSAPI 简介

    JSAPI 简介 JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模块完成收款...

  • iOS --app微信支付

    微信支付分为好几种,这里记录的是app微信支付流程。 适用场景 用户使用xxAPP时,需要通过微信支付完成某项报名...

  • 读iOS微信支付文档

    1.支付申请流程 1.1创建APP 前往开放平台注册成为微信开放平台开发者,完成微信认证和创建APP并通过审核 1...

  • iOS开发支付集成之微信支付

    iOS开发支付集成之微信支付

  • 微信支付相关问题解决网址

    ios微信支付开发遇到的问题 微信支付趟过的坑

  • iOS支付

    支付宝支付 支付宝支付支付宝补充 微信支付 微信支付 内购 iOS开发 内购流程

网友评论

      本文标题:通过云开发完成微信支付

      本文链接:https://www.haomeiwen.com/subject/fipywqtx.html