Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //WeChat JS Library https://res.wx.qq.com/open/js/jweixin-1.0.0.js
- //REFERENCES
- //WeChat official documentation on sharing API http://open.wechat.com/cgi-bin/newreadtemplate?t=overseas_open/docs/oa/web/js-sdk#sharing-apis
- //PHP version of sig gen https://github.com/31ten/wechat-qrcode-scanner/blob/master/jssdk.php
- //SHA1 Code http://coursesweb.net/javascript/sha1-encrypt-data_cs
- //APP ID GENERATION
- //Generated off sandbox from http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
- //Should sign up here http://open.wechat.com/cgi-bin/newreadtemplate?t=overseas_open/section_detail&show=web
- //For us to configure WeChat, we must do the following
- //Step 1. Acquire appID and appSecret
- //Step 2. Acquire WeChat Access Token using the appID and appSecret with the getWeChatAccessToken function
- //Step 3. Acquire JSApiTicket using the access token with the getJSApiTicket function
- //Step 4. Generate a signature which is a SHA1 encoded string including JSAPITicket, url, a nonce nonsense string and a timestamp
- //Step 5. Pass the appID, timestamp, nonce, generated signature and requested api list through wx.config
- //Step 6. Call the weChat mobile share when desired
- define([
- 'jquery',
- 'jweixin',
- 'configurator-env',
- 'configurator-sharing'
- ], function($, wx) {
- var that = Configurator;
- if (!that.enableWechat) {
- return;
- } else {
- that.WeChatConfigs = {
- "appID": "wx320d0e111fd5feba",
- "appSecret": "26c9b6f25b7b3ac097c0e6795c5ed7fd",
- "timestamp": Math.floor(Date.now() / 1000),
- "nonce": "",
- "signature": "",
- "jsApiTicket": ""
- };
- that.WeChat = {
- /* ==================================================
- FUNCTION: initiateWeChat
- Arguments: none
- Initiates the WeChat functionality by generating a signature
- ===================================================== */
- "initiateWeChat": function() {
- that.WeChatConfigs.nonce = that.WeChat.genNonce(18);
- that.WeChat.getWeChatAccessToken();
- },
- /* ==================================================
- FUNCTION: getWeChatAccessToken
- Arguments: none
- Generates Access token via app id and appsecret
- ===================================================== */
- "getWeChatAccessToken": function() {
- var verificationEndpoint = "https://api.wechat.com/cgi-bin/token?grant_type=client_credential&appid="+ WeChatConfigs.appID + "&secret=" + WeChatConfigs.appSecret;
- $.ajax({
- type: "POST",
- url: verificationEndpoint,
- data: {},
- dataType: "json"
- })
- .done(function(data) {
- that.WeChat.getJSApiTicket(data.access_token);
- });
- },
- /* ==================================================
- FUNCTION: genJSApiTicket
- Arguments: accesstoken
- Callback from genWeChatAccessToken which generates the JSAPI Ticket
- required by the WeChat signature
- ===================================================== */
- "getJSApiTicket": function(accessToken) {
- var jsApiTicketEndpoint = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken;
- $.ajax({
- type: "POST",
- url: jsApiTicketEndpoint ,
- data: {},
- dataType: "json"
- })
- .done(function(data) {
- that.WeChatConfigs.jsApiTicket = data;
- that.WeChat.weChatSignature();
- that.WeChat.configWeChat();
- });
- },
- /* ==================================================
- FUNCTION: weChatSignature
- Arguments: Object
- Reads generated jsapi_ticket and creates the SHA1 encoded signature
- ===================================================== */
- "weChatSignature": function() {
- var signature = {
- "jsapi_ticket": that.WeChatConfigs.jsApiTicket,
- "noncestr": that.WeChatConfigs.nonce,
- "timestamp": that.WeChatConfigs.timestamp,
- "url": window.location.href
- };
- signature = JSON.stringify(signature);
- signature = that.SHA1(signature);
- that.WeChat.signature = signature;
- },
- /* ==================================================
- FUNCTION: configWeChat
- Arguments: Object
- Configures WeChat SDK so that we have can gain access to their APIs
- ===================================================== */
- "configWeChat": function() {
- wx.config({
- debug: true,
- appId: that.WeChatConfigs.appID, //Our appID
- timestamp: that.WeChatConfigs.timestamp, //Timestamp in seconds
- nonceStr: that.WeChatConfigs.nonce, //Our generated nonsense string
- signature: that.WeChatConfigs.signature, //a SHA1 encoded string including JSAPITicket, url, a nonce nonsense string and a timestamp
- jsApiList: [
- 'onMenuShareTimeline'
- ]
- });
- },
- /* ==================================================
- FUNCTION: weChatMobileShare
- Arguments: title, link and image
- Utilizes WeChat API to share to a user's Moments Page
- ===================================================== */
- "weChatMobileShare": function(title,link,img) {
- wx.onMenuShareTimeline({
- title: title, // Sharing title
- link: link, // Sharing link
- imgUrl: img, // Sharing image URL
- success: function () {
- console.log("success");
- },
- cancel: function () {
- console.log("failure");
- }
- });
- },
- /* ==================================================
- FUNCTION: genNonce
- Arguments: length
- Generates a nonsense string with predetermined length
- ===================================================== */
- "genNonce": function(length) {
- var nonce = "";
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for(var i = 0; i < length; i++) {
- nonce += possible.charAt(Math.floor(Math.random() * possible.length));
- }
- return nonce;
- }
- };
- /* ==================================================
- FUNCTION: SHA1
- Arguments: msg
- Encodes a message with SHA1
- ===================================================== */
- that.SHA1 = function(msg) {
- function rotate_left(n,s) {
- var t4 = ( n<<s ) | (n>>>(32-s));
- return t4;
- }
- function lsb_hex(val) {
- var str="";
- var i;
- var vh;
- var vl;
- for( i=0; i<=6; i+=2 ) {
- vh = (val>>>(i*4+4))&0x0f;
- vl = (val>>>(i*4))&0x0f;
- str += vh.toString(16) + vl.toString(16);
- }
- return str;
- }
- function cvt_hex(val) {
- var str="";
- var i;
- var v;
- for( i=7; i>=0; i-- ) {
- v = (val>>>(i*4))&0x0f;
- str += v.toString(16);
- }
- return str;
- }
- function Utf8Encode(string) {
- string = string.replace(/\r\n/g,"\n");
- var utftext = "";
- for (var n = 0; n < string.length; n++) {
- var c = string.charCodeAt(n);
- if (c < 128) {
- utftext += String.fromCharCode(c);
- }
- else if((c > 127) && (c < 2048)) {
- utftext += String.fromCharCode((c >> 6) | 192);
- utftext += String.fromCharCode((c & 63) | 128);
- }
- else {
- utftext += String.fromCharCode((c >> 12) | 224);
- utftext += String.fromCharCode(((c >> 6) & 63) | 128);
- utftext += String.fromCharCode((c & 63) | 128);
- }
- }
- return utftext;
- }
- var blockstart;
- var i, j;
- var W = new Array(80);
- var H0 = 0x67452301;
- var H1 = 0xEFCDAB89;
- var H2 = 0x98BADCFE;
- var H3 = 0x10325476;
- var H4 = 0xC3D2E1F0;
- var A, B, C, D, E;
- var temp;
- msg = Utf8Encode(msg);
- var msg_len = msg.length;
- var word_array = [];
- for( i=0; i<msg_len-3; i+=4 ) {
- j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
- msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
- word_array.push( j );
- }
- switch( msg_len % 4 ) {
- case 0:
- i = 0x080000000;
- break;
- case 1:
- i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
- break;
- case 2:
- i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
- break;
- case 3:
- i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8 | 0x80;
- break;
- }
- word_array.push( i );
- while( (word_array.length % 16) != 14 ) word_array.push( 0 );
- word_array.push( msg_len>>>29 );
- word_array.push( (msg_len<<3)&0x0ffffffff );
- for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
- for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
- for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
- A = H0;
- B = H1;
- C = H2;
- D = H3;
- E = H4;
- for( i= 0; i<=19; i++ ) {
- temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
- E = D;
- D = C;
- C = rotate_left(B,30);
- B = A;
- A = temp;
- }
- for( i=20; i<=39; i++ ) {
- temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
- E = D;
- D = C;
- C = rotate_left(B,30);
- B = A;
- A = temp;
- }
- for( i=40; i<=59; i++ ) {
- temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
- E = D;
- D = C;
- C = rotate_left(B,30);
- B = A;
- A = temp;
- }
- for( i=60; i<=79; i++ ) {
- temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
- E = D;
- D = C;
- C = rotate_left(B,30);
- B = A;
- A = temp;
- }
- H0 = (H0 + A) & 0x0ffffffff;
- H1 = (H1 + B) & 0x0ffffffff;
- H2 = (H2 + C) & 0x0ffffffff;
- H3 = (H3 + D) & 0x0ffffffff;
- H4 = (H4 + E) & 0x0ffffffff;
- }
- temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
- return temp.toLowerCase();
- };
- }
- });
Advertisement
Add Comment
Please, Sign In to add comment