国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

微信授權(quán)和sdk加密算法

gaara / 2614人閱讀

摘要:準(zhǔn)備工作申請(qǐng)服務(wù)器公眾號(hào)基本配置這些微信公眾平臺(tái)上都有,就不介紹了,接下來(lái)進(jìn)入正題。隨著微信管控越發(fā)嚴(yán)厲,像一些最基本的網(wǎng)頁(yè)轉(zhuǎn)發(fā)都需要授權(quán)處理才能獲取到圖片和描述,描述審查也是相當(dāng)嚴(yán)格。

準(zhǔn)備工作:

申請(qǐng)服務(wù)器 公眾號(hào) 基本配置 這些微信公眾平臺(tái)上都有,就不介紹了,接下來(lái)進(jìn)入正題。

? 微信網(wǎng)頁(yè)授權(quán)

node js-sdk 授權(quán)
公眾平臺(tái)的技術(shù)文檔目的為了簡(jiǎn)明扼要的交代接口的使用,語(yǔ)句難免晦澀,這里寫(xiě)了些了我所理解的微信開(kāi)放平臺(tái)中關(guān)于利用node.js使用授權(quán)和js-sdk的一些方法,詳情請(qǐng)見(jiàn)微信公眾平臺(tái).如果用戶在微信客戶端中訪問(wèn)第三方網(wǎng)頁(yè),公眾號(hào)可以通過(guò)微信網(wǎng)頁(yè)授權(quán)機(jī)制,來(lái)獲取用戶基本信息,進(jìn)而實(shí)現(xiàn)業(yè)務(wù)邏輯。隨著微信管控越發(fā)嚴(yán)厲,像一些最基本的網(wǎng)頁(yè)轉(zhuǎn)發(fā)都需要授權(quán)處理才能獲取到圖片和描述,描述審查也是相當(dāng)嚴(yán)格。#

網(wǎng)頁(yè)授權(quán)回調(diào)域名的說(shuō)明

在微信公眾號(hào)請(qǐng)求用戶網(wǎng)頁(yè)授權(quán)之前,開(kāi)發(fā)者需要先到公眾平臺(tái)官網(wǎng)中的“開(kāi)發(fā) - 接口權(quán)限 - 網(wǎng)頁(yè)服務(wù) - 網(wǎng)頁(yè)帳號(hào) - 網(wǎng)頁(yè)授權(quán)獲取用戶基本信息”的配置選項(xiàng)中,修改授權(quán)回調(diào)域名。請(qǐng)注意,這里填寫(xiě)的是域名(是一個(gè)字符串),而不是URL,因此請(qǐng)勿加 http:// 等協(xié)議頭;

授權(quán)回調(diào)域名配置規(guī)范為全域名,比如需要網(wǎng)頁(yè)授權(quán)的域名為:www.qq.com,配置以后此域名下面的頁(yè)面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進(jìn)行OAuth2.0鑒權(quán)。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com無(wú)法進(jìn)行OAuth2.0...

網(wǎng)頁(yè)授權(quán)的兩種scope的區(qū)別(snsapi_base snsapi_userinfo)

以snsapi_base為scope發(fā)起的網(wǎng)頁(yè)授權(quán),是用來(lái)獲取進(jìn)入頁(yè)面的用戶的openid的,并且是靜默授權(quán)并自動(dòng)跳轉(zhuǎn)到回調(diào)頁(yè)的。用戶感知的就是直接進(jìn)入了回調(diào)頁(yè)(往往是業(yè)務(wù)頁(yè)面)

以snsapi_userinfo為scope發(fā)起的網(wǎng)頁(yè)授權(quán),是用來(lái)獲取用戶的基本信息的。但這種授權(quán)需要用戶手動(dòng)同意,并且由于用戶同意過(guò),所以無(wú)須關(guān)注,就可在授權(quán)后獲取該用戶的基本信息。

網(wǎng)頁(yè)授權(quán)access_token和普通access_token的區(qū)別

微信網(wǎng)頁(yè)授權(quán)是通過(guò)OAuth2.0機(jī)制實(shí)現(xiàn)的,在用戶授權(quán)給公眾號(hào)后,公眾號(hào)可以獲取到一個(gè)網(wǎng)頁(yè)授權(quán)特有的接口調(diào)用憑證(網(wǎng)頁(yè)授權(quán)access_token),通過(guò)網(wǎng)頁(yè)授權(quán)access_token可以進(jìn)行授權(quán)后接口調(diào)用,如獲取用戶基本信息;

其他微信接口,需要通過(guò)基礎(chǔ)支持中的“獲取access_token”接口來(lái)獲取到的普通access_token調(diào)用。

? 具體步驟: * 代碼配置:
package.json
{
  "name": "js-sdk",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "babel-runtime": "^6.26.0",
    "body-parser": "^1.18.2",
    "cheerio": "^1.0.0-rc.2",
    "connect-mongo": "^2.0.1",
    "connect-redis": "^3.3.3",
    "cookie-parser": "^1.4.3",
    "crypto": "^1.0.1",
    "ejs": "^2.5.7",
    "express": "^4.16.2",
    "express-session": "^1.15.6",
    "fs": "^0.0.1-security",
    "mongoose": "^5.0.16",
    "morgan": "^1.9.0",
    "redis": "^2.8.0",
    "request": "^2.83.0",
    "sha1": "^1.1.1",
    "util": "^0.10.3",
    "utility": "^1.13.1"
  },
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-es2015": "^6.24.1",
    "gulp": "^3.9.1",
    "gulp-autoprefixer": "^4.1.0",
    "gulp-babel": "^7.0.0",
    "gulp-concat": "^2.6.1",
    "gulp-connect": "^5.2.0",
    "gulp-imagemin": "^4.1.0",
    "gulp-minify-css": "^1.2.4",
    "gulp-minify-html": "^1.0.6",
    "gulp-px2rem-plugin": "^0.4.0",
    "gulp-uglify": "^3.0.0",
    "gulp-util": "^3.0.8"
  }
}

app.js
const express = require("express");
const bodyParser = require("body-parser");
const path = require("path");
const logger = require("morgan");
const cookieParser = require("cookie-parser");
const indexRoute = require("./app/routes/index.route");
const app = express();


app.set("views", path.join(__dirname, "app/views"));
app.set("view engine", "ejs");

/*配置靜態(tài)文件路徑*/
app.use(express.static(path.join(__dirname, "public")));

/*配置請(qǐng)求日志*/
app.use(logger("dev"));

/*解析application/json格式數(shù)據(jù)*/
app.use(bodyParser.json());

/*解析application/www-x-form-urlencoded格式數(shù)據(jù)*/
app.use(bodyParser.urlencoded({extended: false}));

/*解析cookie*/
app.use(cookieParser());

/*解析session*/
const session = require("express-session");
app.use(session({
    secret: "123456", //建議使用隨機(jī)字符串
    resave: true,
    saveUninitialized: true,
    cookie: {maxAge: 24 * 60 * 60 * 1000}
}));

/*配置路由*/
app.use("/", indexRoute);

app.use((req,res,next)=>{
    let err = new Error("Error 404, the source is not found!");
    err.status = 404;
    next(err);
});

app.use((err, req, res, next)=>{
    console.log(err);
    res.status(err.status || 500).send(err.message);
    next();
});

module.exports = app;
config/env.config.js
module.exports = {
  port:"80",
    "token":"yourtoken",
    "appID":"***",
    "appsecret":"***",
    "userAppID": "***",
    "userAppSecret": "***"
}
app/routes/index.routes.js
const express = require("express");
const path = require("path");
const authMiddleware = require("../middlewares/auth.middleware");
const router = express.Router();
const querystring = require("querystring");
const url = require("url");
const cheerio = require("cheerio")

router.get("/", authMiddleware.getCode, (req,res,next)=>{
    res.sendFile(path.join(__dirname, "../views/index.html"));
})

app/views/index.html



    
    
    
    Document


    這里只是測(cè)試getCode成功與否

新建 app/config.access_token.json待用

新建 app/config.ticket.json待用

app/middlewares/auth.middlewares.js

exports.getUserInfo = (req,res,next)=>{
    console.log("<-----------------獲取getUserInfo--------------------->")
    console.log("----->req.access_token : "+req.access_token);
    let access_token = req.access_token;
    let openid = req.openid;
    let url = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}&lang=zh_CN`;
    request(url, (err,httpResponse,body)=>{
        console.log("---->--通過(guò)access_token和openid獲取到的用戶個(gè)人信息 :")
        console.log(body);
        let result = JSON.parse(body);
        res.cookie("openid", result.openid, {maxAge: 24 * 60 * 60 * 1000, httpOnly: false});
        res.cookie("nickname", result.nickname, {maxAge: 24 * 60 * 60 * 1000, httpOnly: false});
        res.cookie("headimgurl", result.headimgurl, {maxAge: 24 * 60 * 60 * 10000, httpOnly: false});
        res.cookie("unionid", result.unionid, {maxAge: 24 * 60 * 60 * 1000, httpOnly: false})
        next();
    })
}
* 以snsapi_base為scope發(fā)起的授權(quán) 第一步:用戶同意授權(quán),獲取code
app/middleares/auth.middlewares.js
const config = require("../../config/env.config");
const request = require("request");
const appid = config.appID;
const appsecret = config.appsecret;
/*獲取code*/
exports.getCode = function(req,res,next){
    console.log("--|cookies : "+ JSON.stringify(req.cookies));
    if(req.cookies.openid){
        next();
    }else{
        let back_url = escape(req.url);//解碼,解決url?后面參數(shù)返回消失問(wèn)題 2.req.url 獲取URL
        console.log("獲取的url路由參數(shù)為 :"+back_url)
        let redirect_uri = `{你的域名}/getUserInfo?back_url=${back_url}`;    //注意這里執(zhí)行了getUserInfo路由
        let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect `;
        console.log("重定向的url : "+url);
        //next();
        res.redirect(url);//res.redirect()重定向跳轉(zhuǎn) 參數(shù)僅為URL時(shí)和res.location(url)一樣
    };
};
第二步:通過(guò)code換取網(wǎng)頁(yè)授權(quán)access_token
/*獲取access_token*/
exports.getAccess_token = (req,res,next)=>{
    console.log("<------------------獲取snsapi_base access_token----------------------->")
    console.log(JSON.stringify(req.query))
    let code = req.query.code;
    let url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${appsecret}&code=${code}&grant_type=authorization_code `;
    request(url, (err, httpResponse, body)=>{
        console.log(err);
        console.log("--||--code換取的所有信息 :"+body);
        let result = JSON.parse(body);
        req.access_token = result.access_token;
        req.openid = result.openid;
        next();
    })
};
第三步:拉取用戶信息(需scope為 snsapi_userinfo)
/getUserInfo使用了getAccess_token getUserInfo 中間件 在code沒(méi)過(guò)期的情況下可以進(jìn)一步獲取access_token 和個(gè)人信息
router.get("/getUserInfo", authMiddleware.getAccess_token, authMiddleware.getUserInfo, function (req, res, next) {
    console.log("<------------------"/getUserInfo"----------------------->");
    console.log("----->|查詢的url字符串參數(shù) :" + JSON.stringify(req.query));
    let back_url = req.query.back_url;
    for (let item in req.query) {
        if (item !== "back_url" && item !== "code" && item !== "state") {
            back_url += "&" + item + "=" + req.query[item];
        };
    };
    console.log("---->|重新篩選路徑back_url : " + back_url);
    res.redirect(back_url);
});
# * 以snsapi_userinfo為scope發(fā)起的授權(quán)
app/middlewares/accessToken.middlesware.js
let weixinConfig = require("../../config/env.config.js");
let request = require("request");
let fs = require("fs");
//獲取accessToken
exports.accessToken = function (req, res, next) {
    console.log("<------------------"獲取snsapi_userinfo accessToken"----------------------->");
    let valide = isValide(); //{ code: 0, result: result.access_token } or{code:1001}
    if (valide.code === 0) {
        //access_token還沒(méi)過(guò)期,用以前的
        req.query.access_token = valide.result;
        next();
    } else {
        //重新獲取access_token && expire_in
        let appid = weixinConfig.appID;
        let secret = weixinConfig.appsecret;
        let url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
        request(url, function (error, response, body) {
            let result = JSON.parse(body);
            let now = new Date().getTime(); //new Date().getTime() 獲得的是毫秒
            result.expires_in = now + (result.expires_in - 20) * 1000; //expire_in一般是7200s 提前20毫秒

            req.query.access_token = result.access_token; //new access_token
            req.query.tokenExpired = result.expires_in; // 7200s
            next();
        });
    };
};

//獲取ticket
exports.ticket = function (req, res, next) {
    console.log("<------------------"獲取ticket"----------------------->");
    let ticketResult = isTicket();
    if (ticketResult.code === 0) {
        console.log("已經(jīng)有了ticket : " + JSON.stringify(ticketResult));
        req.query.ticket = ticketResult.result;
        next();
    } else {
        console.log("開(kāi)始獲取ticket");
        let access_token = req.query.access_token;
        let _tokenResult = {
            access_token: req.query.access_token,
            expires_in: req.query.tokenExpired
        };
        let url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";
        request(url, function (err, response, body) {
            let result = JSON.parse(body);
            console.log(result);
            if (result.errcode == "0") {
                let now = new Date().getTime();
                result.expires_in = now + (result.expires_in - 20) * 1000; //   改變時(shí)間為當(dāng)前時(shí)間的兩小時(shí)后
                fs.writeFileSync("./config/access_token.json", JSON.stringify(_tokenResult)); //fs.writeFileSync:以同步的方式將data寫(xiě)入文件,文件已存在的情況下,原內(nèi)容將被替換。
                fs.writeFileSync("./config/ticket.json", JSON.stringify(result));
                console.log("異步寫(xiě)入access_token ticket.json");
                req.query.ticket = result.ticket;
                next();
            };
        });
    };
};

function isValide() {
    //有效
    let result = fs.readFileSync("./config/access_token.json").toString(); //同步讀取json文件 //這里用toString的原因:讀出來(lái)的數(shù)據(jù)是一堆包含著16進(jìn)制數(shù)字的對(duì)象,必須通過(guò)toString轉(zhuǎn)為字符串形式
    if (result) {
        result = JSON.parse(result);
        let now = new Date().getTime();
        if (result.access_token && result.expires_in && now < result.expires_in) {
            console.log("access_token 還在7200s以內(nèi),沒(méi)有過(guò)期"); //access_token有效 expires_in應(yīng)該指的是距離生成時(shí)間的7200秒后
            return { code: 0, result: result.access_token };
        } else {
            console.log("access_token 失效");
            return { code: 1001 };
        }
    } else {
        return { code: 1001 };
    };
};

function isTicket() {
    let result = fs.readFileSync("./config/ticket.json").toString();
    console.log("result:", result);
    if (result) {
        result = JSON.parse(result);
        console.log(result);
        let now = new Date().getTime();
        if (result.ticket && result.expires_in && now < result.expires_in) {
            console.log("ticket有效,沿用當(dāng)前ticket.json里的ticket");
            return { code: 0, result: result.ticket };
        } else {
            console.log("ticket無(wú)效需要獲取");
            return { code: 1001 };
        }
    } else {
        return { code: 1001 };
    };
}

accessToken.middlesware.js寫(xiě)了關(guān)于獲取以snsapi_userinfo為scope發(fā)起的網(wǎng)頁(yè)授權(quán)的access_token ticket,并用fs以json字符串的形式存到本地,并檢測(cè)過(guò)期時(shí)間,如果沒(méi)過(guò)期就繼續(xù)讀取使用,如果過(guò)期就重新獲取并儲(chǔ)存在心的access_token ticket到本地

app/routes/index.routes.js

const crypto = require("crypto");
const sha1 = require("sha1");
const accessTokenMiddle = require("../middlewares/accessToken.middleware.js");
const weixin = require("../../config/env.config");

router.get("/weixin", accessTokenMiddle.accessToken, accessTokenMiddle.ticket, function (req, res, next) {
    console.log("<------------------"/weixin"----------------------->");
    console.log("----->| req.query : " + JSON.stringify(req.query));
    crypto.randomBytes(16, function (ex, buf) {
        let appId = weixin.appID;
        let noncestr = buf.toString("hex");
        let jsapi_ticket = req.query.ticket;
        let timestamp = new Date().getTime();
        timestamp = parseInt(timestamp / 1000);
        let url = req.query.url;
        console.log("參數(shù) :");
        console.log(noncestr);
        console.log(jsapi_ticket);
        console.log(timestamp);
        console.log(url);

        let str = ["noncestr=" + noncestr, "jsapi_ticket=" + jsapi_ticket, "timestamp=" + timestamp, "url=" + url].sort().join("&");
        console.log("待混淆加密的字符串 : ");
        console.log(str);
        let signature = sha1(str);

        console.log("微信sdk簽名signature :");
        console.log(signature);

        let result = { code: 0, result: { appId: appId, timestamp: timestamp, nonceStr: noncestr, signature: signature } };

        res.json(result); //res.json 等同于將一個(gè)對(duì)象或數(shù)組傳到給res.send()
    });
});

在html頁(yè)面使用微信公眾平臺(tái)提供的API 需要引用 http://res.wx.qq.com/open/js/...
在靜態(tài)文件中調(diào)用分享功能的api 更多API請(qǐng)打開(kāi) # 微信JS-SDK說(shuō)明文檔

public/index.html



    
    
    
    Document


    

userList....

public/js/userList.js let signatureUrl = url.split("#")[0]; let URL = encodeURIComponent(signatureUrl); let title = "這是分享的表標(biāo)題"; let desc = "this is description"; let shareUrl = window.location.href; let logo = "http://yizhenjia.com/dist/newImg/logo.png"; SHARE(title, desc, shareUrl, logo); $.get("/weixin?url=" + URL, function(result) { if (result.code == 0) { wx.config({ debug: false, // 開(kāi)啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開(kāi),參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。 appId: result.result.appId, // 必填,公眾號(hào)的唯一標(biāo)識(shí) timestamp: result.result.timestamp, // 必填,生成簽名的時(shí)間戳 nonceStr: result.result.nonceStr, // 必填,生成簽名的隨機(jī)串 signature: result.result.signature, // 必填,簽名,見(jiàn)附錄1 jsApiList: ["onMenuShareAppMessage", "onMenuShareTimeline", "chooseImage", "scanQRCode", "getLocation", "openLocation"] // 必填,需要使用的JS接口列表,所有JS接口列表見(jiàn)附錄2 }); }; }); function SHARE(title, desc, shareUrl, logo) { wx.ready(function() { // config信息驗(yàn)證后會(huì)執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶端的異步操作,所以如果需要在頁(yè)面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來(lái)確保正確執(zhí)行。對(duì)于用戶觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。 //分享 wx.onMenuShareAppMessage({ title: title, // 分享標(biāo)題 desc: desc, // 分享描述 link: shareUrl, // 分享鏈接 imgUrl: logo, // 分享圖標(biāo) type: "", // 分享類(lèi)型,music、video或link,不填默認(rèn)為link dataUrl: "", // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認(rèn)為空 success: function() { 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) alert("分享成功!"); }, cancel: function() { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) }, fail: function(err) { alert("分享失敗"); } }); }); wx.error(function(res) { // config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過(guò)期導(dǎo)致驗(yàn)證失敗,具體錯(cuò)誤信息可以打開(kāi)config的debug模式查看,也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名。 //alert("Error"); }); }
注釋?zhuān)?/b> 微信開(kāi)發(fā)必須在微信開(kāi)發(fā)者工具上開(kāi)發(fā),且只能是默認(rèn)80端口,在開(kāi)發(fā)中經(jīng)常有80端口被占用的情況,如果有請(qǐng)使用

lsof -i tcp:80
kill -9 進(jìn)程

如果想在手機(jī)上測(cè)試 并抓包數(shù)據(jù) 可以使用charles抓包工具

打開(kāi)charles 點(diǎn)擊Proxy setting 設(shè)置 port
保證手機(jī)和電腦處于同一Wi-Fi下,配置手動(dòng)代理 輸入IP和端口 查看ip地址 :charles上可查看 或者終端輸入ifconfig (cmd:ipconfig)
掃碼或使用地址即可訪問(wèn)

在獲取以snsapi_userinfo為scope發(fā)起的網(wǎng)頁(yè)授權(quán)的時(shí)候使用的方式是fs儲(chǔ)存到本地的方式,你也可以采用其他方式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100544.html

相關(guān)文章

  • 微信小程序開(kāi)發(fā):python+sanic 實(shí)現(xiàn)小程序登錄注冊(cè)

    摘要:參考鏈接微信小程序七日談第五天你可能要在登錄功能上花費(fèi)大力氣理解認(rèn)證及實(shí)踐網(wǎng)站微信登錄實(shí)現(xiàn)最后,感謝女朋友支持。 開(kāi)發(fā)微信小程序時(shí),接入小程序的授權(quán)登錄可以快速實(shí)現(xiàn)用戶注冊(cè)登錄的步驟,是快速建立用戶體系的重要一步。這篇文章將介紹 python + sanic + 微信小程序?qū)崿F(xiàn)用戶快速注冊(cè)登錄全棧方案。 微信小程序登錄時(shí)序圖如下: showImg(https://segmentfaul...

    antz 評(píng)論0 收藏0
  • 微信小程序開(kāi)發(fā):python+sanic 實(shí)現(xiàn)小程序登錄注冊(cè)

    摘要:參考鏈接微信小程序七日談第五天你可能要在登錄功能上花費(fèi)大力氣理解認(rèn)證及實(shí)踐網(wǎng)站微信登錄實(shí)現(xiàn)最后,感謝女朋友支持。 開(kāi)發(fā)微信小程序時(shí),接入小程序的授權(quán)登錄可以快速實(shí)現(xiàn)用戶注冊(cè)登錄的步驟,是快速建立用戶體系的重要一步。這篇文章將介紹 python + sanic + 微信小程序?qū)崿F(xiàn)用戶快速注冊(cè)登錄全棧方案。 微信小程序登錄時(shí)序圖如下: showImg(https://segmentfaul...

    Nino 評(píng)論0 收藏0
  • 微信公眾號(hào)開(kāi)發(fā)中的支付流程

    摘要:今天聊一下微信公眾號(hào)開(kāi)發(fā)在授權(quán)網(wǎng)頁(yè)中的支付流程。前端獲得簽名后,再請(qǐng)求微信服務(wù)器,下面的支付流程就可以繼續(xù)下去了。 今天聊一下微信公眾號(hào)開(kāi)發(fā)在授權(quán)網(wǎng)頁(yè)中的支付流程。 微型公眾號(hào)開(kāi)發(fā)有以下幾個(gè)步驟:1.獲取全局access_token2.獲取網(wǎng)頁(yè)授權(quán)的access_token和refresh_token3.獲取網(wǎng)頁(yè)授權(quán)的簽名(前端用于獲取調(diào)用JSSDK的權(quán)限)4.公眾號(hào)支付-調(diào)用統(tǒng)一下單...

    蘇丹 評(píng)論0 收藏0
  • 在線視頻常見(jiàn)加密方式及安全性透析

    摘要:協(xié)議由來(lái)已久,是公司推出的視頻播放協(xié)議,穩(wěn)定性和安全性較更好,應(yīng)用廣泛。但是加密算法過(guò)于簡(jiǎn)單,通過(guò)解密,即可實(shí)現(xiàn)本地觀看。可以看到視頻采用了的加密算法。目前尚無(wú)解密方案出現(xiàn),安全級(jí)別極高。 信息化時(shí)代,多媒體的應(yīng)用日漸成為人們生活中不可或缺的部分,無(wú)論是獲取最新資訊還是教育學(xué)習(xí),視頻都是直觀高效的媒介之一。 基于互聯(lián)網(wǎng)的快速傳播,眾多培訓(xùn)機(jī)構(gòu)也逐漸將線下原創(chuàng)版權(quán)課程遷移到在線平臺(tái)中,一...

    kohoh_ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<