亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信小程序如何開發微信支付功能

發布時間:2022-03-15 10:17:28 來源:億速云 閱讀:211 作者:iii 欄目:開發技術

本篇內容主要講解“微信小程序如何開發微信支付功能”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“微信小程序如何開發微信支付功能”吧!

第一步:用戶請求開發者后臺,發起下單請求

  • 發起請求前在小程序端調用 wx.checkSession() 查看 session_key 是否過期

    • 如果過期了 重新調用 wx.login() 返回 session_key 和 openid

    • 如果沒過期 繼續下一步操作,請求開發者后臺

第二步:開發者查找一下數據庫或者緩存里是否有 openid 和 session_key

  • 如果有生成訂單編號 out_trade_no

  • 如果沒有返回錯誤消息,缺少 openid 、 session_key

第三步:開發者服務器請求統一下單 API ,帶上要求的參數:

appid
mch_id
nonce_str
sign
body
out_trade_no
total_fee
spbill_create_ip

nonce_str 獲取隨機字符串:

test.js

  • js

/*
 *  功能: 返回32位隨機字符串
 *  create by tiankai on 2018-06-25 15:39
 */
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

  • js

  • js

/*
 *  功能:sign 參數簽名
 *  create by tiankai on 2018-06-26 12:00
 */
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

  • js

const xml2js = require('xml2js');

//xml->json
//xml2js默認會把子子節點的值變為一個數組, explicitArray設置為false
var xmlParser = new xml2js.Parser({explicitArray : false, ignoreAttrs : true})
//json->xml
var jsonBuilder = new xml2js.Builder();

請求參數轉換為 xml

test.js

  • js

/*
 *  功能:獲取統一下單 API 請求XML參數
 *  create by tiankai on 2018-06-25 15:23
 */
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;
    /* console.log("--------------------------");
     * console.log(sign);
     * console.log("--------------------------"); */
    let xml = await jsonBuilder.buildObject(signString);
    /* console.log(xml); */
    return xml;
}

然后就可以發起統一下單API請求了

test.js

  • js

/*
 *  功能:調用統一下單API接口
 *  create by tiankai on 2018-06-26 11:01
 */
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){
            /* console.log(jsonData); */
            data = jsonData;
        }
    });
    return data;
}

第四步:當請求成功時 判斷一下 return_code 和 result_code

  • 如果它們都等于 SUCCESS 的時候,微信會把我們需要的預支付訂單信息 prepay_id 返回來,

  • 否則返回 return_msg 給前端 展示具體錯誤

第五步:拿上 prepay_id ,進行再次簽名,然后返回給前端

test.js

  • js

/*
 *  功能:統一下單接口返回 prepay_id 再次簽名 返回給前端
 *  create by tiankai on 2018-06-26 15:45
 */
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

  • js

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

第七步:支付成功后,微信服務器會把支付結果返回給配置的 notify_url ,開發者根據支付結果,更新服務器的訂單狀態。

到此,相信大家對“微信小程序如何開發微信支付功能”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定陶县| 宾川县| 景德镇市| 深水埗区| 全椒县| 广灵县| 乡城县| 沾化县| 普格县| 隆昌县| 黄浦区| 米泉市| 于都县| 闻喜县| 广州市| 张掖市| 库伦旗| 光泽县| 巨野县| 都匀市| 甘德县| 基隆市| 涿鹿县| 巴楚县| 平南县| 麻栗坡县| 泸水县| 遵义市| 广东省| 衢州市| 成武县| 台东市| 十堰市| 黄石市| 甘孜| 济南市| 怀来县| 北流市| 尼勒克县| 福清市| 茂名市|