文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

微信小程序如何开发微信支付功能

2023-06-26 09:21

关注

本篇内容主要讲解“微信小程序如何开发微信支付功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序如何开发微信支付功能”吧!

用户请求开发者后台,发起下单请求

开发者查找一下数据库或者缓存里是否有 openid 和 session_key

开发者服务器请求统一下单 API ,带上要求的参数:

appidmch_idnonce_strsignbodyout_trade_nototal_feespbill_create_ip

nonce_str 获取随机字符串:

test.js

getNonceStr(){    let char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';    let len = 32;    let result = '';    for(let i = 0; i < len; i++){        let randomNum = Math.floor(Math.random()*char.length);        result += char[randomNum];    }    return result;}

sign 参数签名, 第二个tab(js)是调用函数的方法, key 为商户平台设置的密钥 key 

test.js

async makeSign(params, key){    // 生成签名 sign    let strOrderArr = Object.keys(params).sort();    let stringA = "";    strOrderArr.map(val =>{        //如果参数值为空,或者验证返回的 sign 不参与签名        if(            think.isNullOrUndefined(params[val]) ||            val === 'sign' ||            params[val].length === 0        ) return;        stringA += val + "=" + params[val] + "&";    });    let stringSignTemp = stringA + "key=" + key;    let sign = think.md5(stringSignTemp).toUpperCase();    return sign;}

得到这几个参数就开始发起请求统一下单 API 了,这里需要注意的是,请求参数应该以 xml 的形式传送过去,这里借助一个工具 xml2js 把对象转换为 xml,也可以把 xml 转换为 对象、json。

安装 xml2js

npm i xml2js

使用 xml2js

test.js

const xml2js = require('xml2js');//xml->json//xml2js默认会把子子节点的值变为一个数组, explicitArray设置为falsevar xmlParser = new xml2js.Parser({explicitArray : false, ignoreAttrs : true})//json->xmlvar jsonBuilder = new xml2js.Builder();

请求参数转换为 xml

test.js

async getUnifiedOrderParams(){    let signString = {        appid: config.appid,        mch_id: config.mchid,        nonce_str: await this.getNonceStr(),        body: '短信平台-短信套餐购买',        out_trade_no: '20180926125346',//订单号        total_fee: 88,//订单金额        //APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP        //需要自行获取,这里只是为了测试直接写上了        spbill_create_ip: '123.12.12.123',        notify_url: config.notify_url,        trade_type: 'JSAPI',        openid: await think.cache('openId')    }    let sign = await this.makeSign(signString,config.key);    signString.sign = sign;        let xml = await jsonBuilder.buildObject(signString);        return xml;}

然后就可以发起统一下单API请求了

test.js

async unifiedOrder(){    let xmlParams = await this.getUnifiedOrderParams();    let unifiedOrderUrl = config.unifiedOrderUrl;    let opt = {        method: "POST",        mode: 'cors',        headers: {            'content-type': 'text/xml'        },        body: xmlParams    }    let res = await this.fetch(unifiedOrderUrl, opt);    //这里微信返回的也是 xml    let result = await res.text();    let data = null;    // 微信返回的 XML 转换为 JSON    xmlParser.parseString(result,function(err, jsonData){        if(!err){                        data = jsonData;        }    });    return data;}

当请求成功时 判断一下 return_code 和 result_code

拿上 prepay_id ,进行再次签名,然后返回给前端

test.js

async payParams(){    let signString = {        appid: config.appid,        timeStamp: +new Date(),        nonce_str: await this.getNonceStr(),        package: null,        signType: 'MD5'    }    //调用 统一下单 API    let jsonData = await this.unifiedOrder();    if(think.isNullOrUndefined(jsonData) &&       jsonData.xml.return_code === 'SUCCESS' &&       jsonData.xml.result_code === 'SUCCESS'    ){        signString.package = 'perpay_id='+jsonData.xml.perpay_id    }else{        return jsonData.xml.return_msg;    }    //进行再次签名    let paySign = await this.makeSign(signString,config.key);    signString.paySign = paySign;    let { appid, signType, ...result } = signString;    // result 中不包括 appid 和 signType 返回给前端    return result;}

用户确认支付后,小程序端调用支付接口,根据返回结果提示用户

test.js

wx.requestPayment({   'timeStamp': '',   'nonceStr': '',//后端返回的随机字符串   'package': '',//后端返回的   'signType': 'MD5',   'paySign': '',//后端返回的   'success':function(res){   },   'fail':function(res){   }});

支付成功后,微信服务器会把支付结果返回给配置的 notify_url ,开发者根据支付结果,更新服务器的订单状态。

到此,相信大家对“微信小程序如何开发微信支付功能”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯