1. 程式人生 > >微信公眾號開發中遇到的問題——支付回撥,分享,獲取openId(三)

微信公眾號開發中遇到的問題——支付回撥,分享,獲取openId(三)

微信的統一下單介面(https://api.mch.weixin.qq.com/pay/unifiedorder)中,下單時,有這樣一個引數:notify_url,該引數是為接收微信支付非同步通知回撥的地址,通知url必須為直接可訪問的url,不能攜帶引數。之前我做回撥的時候,為了效能方面的考慮,沒有使用這種方式,而是在這個方法中:

wx.ready(function(){
	wx.chooseWXPay({
	    "timestamp": timestamp, // 支付簽名時間戳,注意微信jssdk中的所有使用timestamp欄位均為小寫。但最新版的支付後臺生成簽名使用的timeStamp欄位名需大寫其中的S字元
	    "nonceStr": nonceStr, // 支付簽名隨機串,不長於 32 位
	    "package": 'prepay_id=' + prepayId, // 統一支付介面返回的prepay_id引數值,提交格式如:prepay_id=***)
	    "signType": 'MD5', // 簽名方式,預設為'SHA1',使用新版支付需傳入'MD5'
	    "paySign": paySign, // 支付簽名
	    success: function (res) {
	    	//支付成功
	    },
	    cancel:function(res){
	    	//支付取消
	    },
	    fail:function(res){
	    	//支付失敗
	    }
	});
});

當success、cancel、fail的時候,用ajax直接呼叫後臺做回撥操作,這樣做的好處是不用在點選支付的時候做操作訂單等一系列操作,提高了支付彈出框彈出的速度;但是後來測試的時候,發現使用者支付完成之後,如果沒有點選微信支付成功頁面右上角的完成按鈕時,就回調不到success中的回撥方法。那這樣問題就很大了,所以我只能修改成在notify_url中做回撥操作,但是呼叫這個方法的時候,不能攜帶引數,那就不知道是哪個訂單做的回撥。我是這樣解決的,下單介面中有個attach引數,我把訂單的id放入到了這個引數中,回撥時會原樣返回來,不知道有沒有其他方法沒有,歡迎大家提供方法。

2、微信分享
a)
在需要被分享的頁面,引入js:<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript"></script>
b)
準備微信Jssdk的基本配置資訊:
wx.config({
    appId: appId, // 必填,公眾號的唯一標識
    timestamp: timestamp, // 必填,生成簽名的時間戳
    nonceStr: nonceStr, // 必填,生成簽名的隨機串
    signature: signature,// 必填,簽名,見附錄1
    jsApiList: ['onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone','onMenuShareTimeline'] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
});
wx.error(function(res){
	alert(res.errMsg);
});

c)
準備好引數之後呼叫相關分享的方法:
wx.ready(function(){
	//分享到聊天
	wx.onMenuShareAppMessage({
	    title: shareTitle, // 分享標題
	    desc: shareDesc, // 分享描述
	    imgUrl: shareImg,//分享圖片
	    success: function () { 
	        // 使用者確認分享後執行的回撥函式
	    },
	    cancel: function () { 
	        // 使用者取消分享後執行的回撥函式
	    }
	});
	
	//分享到QQ
	wx.onMenuShareQQ({
	    title: shareTitle, // 分享標題
	    desc: shareDesc, // 分享描述
	    imgUrl: shareImg,//分享圖片
	    success: function () { 
	        // 使用者確認分享後執行的回撥函式
	    },
	    cancel: function () { 
	        // 使用者取消分享後執行的回撥函式
	    }
	});
	
	//分享到微博
	wx.onMenuShareWeibo({
	    title: shareTitle, // 分享標題
	    desc: shareDesc, // 分享描述
	    imgUrl: shareImg,//分享圖片
	    success: function () { 
	        // 使用者確認分享後執行的回撥函式
	    },
	    cancel: function () { 
	        // 使用者取消分享後執行的回撥函式
	    }
	});
	
	//分享到qq空間
	wx.onMenuShareQZone({
	    title: shareTitle, // 分享標題
	    desc: shareDesc, // 分享描述
	    imgUrl: shareImg,//分享圖片
	    success: function () { 
	        // 使用者確認分享後執行的回撥函式
	    },
	    cancel: function () { 
	        // 使用者取消分享後執行的回撥函式
	    }
	});
	
	//分享到朋友圈
	wx.onMenuShareTimeline({
	    title: shareTitle, // 分享標題
	    desc: shareDesc, // 分享描述
	    imgUrl: shareImg,//分享圖片
	    success: function () { 
	        // 使用者確認分享後執行的回撥函式
	    },
	    cancel: function () { 
	        // 使用者取消分享後執行的回撥函式
	    }
	});
});

d)
在wx.config中,timestamp、nonceStr、signature三個引數強烈建議用ajax動態獲取,如果不是動態獲取的首次分享可能沒有問題,但是當被分享人開啟這個頁面再次分享時就會出現問題,這個一定要注意。
var timestamp;
var nonceStr;
var signature;
//這裡要特別強調這個url,獲取signature時提供的url,一定要用這種方法,
//encodeURIComponent類似於java中的URIEncoding.encode方法,因為當url中有傳遞的引數時,如果不加密就會報錯
var url = encodeURIComponent(location.href.split('#')[0]);
$.ajax({
	type: "POST",
	async: false,
    url: "${pageContext.request.contextPath }/course/getJsSdk.action",
    data:"url="+url,
    success: function(msg){
    	var msgArr = msg.split("##");
    	timestamp = msgArr[0];
    	nonceStr = msgArr[1];
    	signature = msgArr[2];
    },
    error: function(msg){
    	alert("資料錯誤!");
    }
});

getJsSdk方法:
/**
 * 獲取JsSdk的資訊
 * @throws Exception
 */
@Action("getJsSdk")
public void getJsSdk() throws Exception{
	String url = request.getParameter("url");
	log.info("url = " + url);
	String ticket = AdvancedUtil.getTicket(WSPostUtil.getToken());
	jssdk = JsSdkUtil.getSignature(ticket,url);
	printInfo(jssdk.getTimestamp() + "##" + jssdk.getNoncestr() + "##" + jssdk.getSignature());
}

這個方法中用到的相關方法,我在上篇部落格中已經有提到,如果有疑問的,可以給我留言,謝謝。

3、獲取openId(使用者沒有關注公眾號)

如果要獲取openid,可以在頁面中把連結地址中把連結寫成這種形式:
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=&redirect_uri=http%3A%2F%2Fwww.XXX.com%2Ftest.action&response_type=code&scope=snsapi_base&state=state#wechat_redirect">獲取openId</a>,其中把appid換成自己公眾號的appid,然後在test方法中,通過獲取到的code來獲取openId。scope=snsapi_base當把scope引數設定成snsapi_base時,也就只能獲取到openId;如果要想獲取使用者的基本資訊,要把scope設定成snsapi_userinfo,在使用者沒有關注公眾號的時候,通過使用者授權來獲取使用者資訊。

相關推薦

公眾開發遇到的問題——支付分享獲取openId

微信的統一下單介面(https://api.mch.weixin.qq.com/pay/unifiedorder)中,下單時,有這樣一個引數:notify_url,該引數是為接收微信支付非同步通知回撥的地址,通知url必須為直接可訪問的url,不能攜帶引數。之前我做回撥的時

公眾開發遇到的問題——支付

第一次開發微信公眾號,也是第一次接觸微信公眾號的支付,我使用的是jssdk,用h5頁面呼叫的支付,後臺使用的是java。首先宣告,我不是一個憤世嫉俗的人,也不喜歡吐槽,我認為別人提供介面就已經很不錯了,幹嘛要吐槽呢?但是,這一次,我不得不說,微信公眾號支付的文件真是渣!!!

測試公眾開發token驗證的解決辦法即介面配置資訊的url和token怎麼設定的方法

首先我們來看兩張圖,第一張是微信公眾號中設定的圖 第二張是測試號中的圖片,之所以打馬賽克是怕不良之心的人,如果有疑問可以在文章後留言,因為本人在這個問題上搗鼓了好幾天,所以比較有心得,而微信公眾號的開發文件或者百度的資料都不多,所以很容易走彎路 現在講講介面配

公眾開發關於cookie的問題

最近在做的一個專案中使用到了微信公眾號,在公眾號中開啟的頁面中需要使用到cookie,這樣方便兩個頁面之間的傳值,但是發現頁面跳轉時候cookie已經過期。百思不得其解,瀏覽器中測試正常的,到了微信中

公眾開發FromUserName值為空

在用tp5寫微信公眾號開發過程中,當用戶向公眾號傳送文字訊息時,回撥返回的xml字串中ToUserName居然為空(即使用者傳送的微訊號為空)。 <xml> <ToUserName><![CDATA[]]></ToUserName&

公眾開發的使用者賬號繫結

轉自:http://abyssly.com/2013/09/20/wx_bind/ 最近由於工作需要,接觸了微信公眾號的開發。業務上要求繫結微信使用者和系統使用者,以便使用者在一次繫結後能夠通過系統使用者的身份去使用一些功能。我關注的招行信用卡公眾號實現了這個功能,所以估

公眾開發《一》OAuth2.0網頁授權認證獲取使用者的詳細資訊實現自動登陸

從接觸公眾號到現在,通過不斷積累學習,對如何呼叫微信提供介面有了一定的見解。當然在開發過程中遇到很多問題,現在把部分模組功能在這備案一下,做個總結也希望能給其他人幫助 工欲善其事,必先利其器,先看看開發公眾號需要準備或瞭解什麼 web開發工具:官方提供的開發工具,使用自己

公眾OAuth 點選選單按鈕 跳轉頁面授權 獲取openid

流程: 使用者點選選單按鈕 —–> 傳送頁面授權請求到微信後臺 —–>得到code傳送到 我們伺服器後臺的url —–> 將code引數傳送到微信後臺獲取使用者的openid返回伺服器上的頁面(也可以直接獲取使用者頭像等基本資訊。。需

《初識Java公眾開發》 學習遇到的困難

.cn spa 變量名 es2017 sha1 [] encoding ted 沒有 前一段時間無聊的時候,在慕課網上自學了一點點微信公眾號開發(受學姐威脅)。 慕課網教程的地址:http://www.imooc.com/learn/368 畢竟是免費的課程,不可能講的

nodejs公眾開發-介面配置和簽名驗證

意外金喜的部落格 : http://blog.csdn.net/zzwwjjdj1 -- 建立專案 nodejs微信開發,本文介紹的是在express中使用 express命令列建立專案 :點選這裡, 建立專案 : weixin_ex

java的公眾開發支付

步驟一:我們需要將微信支付所需要的引數組裝好,然後傳送請求。 所需要的引數在微信支付開發文件中就可以找到我們所必須的11個引數。 步驟二:然後在回撥函式中處理我們支付後的業務邏輯。 /** * * 獲得威微信支付的相關引數

公眾開發過程遇到的坑

小白進行微信公眾號開發有半年,遇到了許多坑,android和IOS的相容性的時代性問題,還要微信瀏覽器的不友善;慢慢跟後續會加,有遇到的同行可以補充;以下; 1.點選事件失效     點選事件失效是最快遇到的問題,這個在android上沒有出現過問題,一般在IOS上面,尤

Django公眾開發公眾支付

前言   微信公眾號開發又一重要項就是微信支付,如何在微信公眾號中或者微信自帶的瀏覽器中實現微信支付呢?這就是本文的目的。   對於微信支付有幾種分類,一種是app支付(顧名思義給予一些軟體app使用的)、微信內H5支付(什麼意思呢,就是微信內建的瀏

小程式和公眾開發注意事項有些是從開發文件摘抄出來的

先從簡單的說起 (會提醒你的一些注意事項) 1、微信公眾號和小程式名稱可以由中文、數字、英文。長度在3-20個字元之間,一箇中文字等於2個字元。 2、微信公眾號和小程式名稱不得與公眾平臺已有的訂閱號

公眾開發-圖文訊息的URL如何帶訂單號碼

如下是圖文訊息的應答內容: {     "touser":"o14bw0xPaH8SfXB8I4iMvTNCEGzY",     "msgtype":"news",     "news":{             "articles":[             {   

公眾開發支付開發

微信公眾號開發對接,開發文件也有蠻多坑,所以一路的血淚教訓,這次先針對微信支付整理一下支付的踩坑全過程,開發時間緊現在整理出來,既是對此段時間的學習總結,也希望對遇到同樣問題的童鞋可以有參考價值。 1. 微信掃碼支付 認證微信服務號,申請開通微信支付功能,獲取到微信支付

nodejs公眾開發-access_token獲取與儲存

var utils = {}; var sha1 = require('sha1'); var request = require('request'); var redis = require("redis"); var client = redis.createClient(); clien

公眾開發---支付之H5頁面WAP端接入

更新:2015年12月3日微信提供 Wap 支付, 開發者文件:【微信支付】開發者文件 1.前言 公司是通過支付寶和微信支付那塊內容獲取收入,app端已經接入成功,現在要做WAP端。需要頁面和後臺介面一起來實現。 2.介面接入 因為微信支付版本更新了,網上

公眾開發使用測試不能測試支付介面的解決方案

概述 大家很清楚,在測試環境中公眾號的app id是絕對不能和生產環境的app id相同!!!如果這個問題都不清楚的就應該面壁去。。。 通常在測試環境上使用的的app id有兩種,分別如下。 (1)公眾號內提供的測試號 (2)另外一個公眾號 對

公眾開發--------支付

前言公司最近接了個專案,該專案需要用到微信支付模組。本想簡單點處理直接前端發起支付,後端回撥接收。但前端不知道出了什麼問題,一直無法成功調起微信支付。無奈只好轉後臺來做。開發流程1、先在微信支付 商家裡配置授權目錄,如果你的授權目錄是http://www.xxx.com/we