1. 程式人生 > >Android利用微信SDK分享到微信教程,回撥分享結果錯誤解決和注意點

Android利用微信SDK分享到微信教程,回撥分享結果錯誤解決和注意點

在正式開始之前這裡要著囉嗦一下,進來的同學一定要看,在申請應用的時候要填一個簽名,這個簽名是由應用的簽名檔案keystore決定的,那麼你在填這個簽名的時候,一定要把你的應用用正式的keyStore生成apk,安裝到手機,然後用微信提供的獲取應用簽名的apk工具獲取你應用的簽名,然後這會生成的這個簽名才是正確的,千萬記得,不要使用dubug的ketStore測試,不然後面雖然可以修改,修改了後要稽核,但是稽核也是需要時間的,會很麻煩。

還有一點,你在測試微信分享的時候可能會直接在Eclipse好或者Studio執行專案,那樣使用的肯定是dubug的keyStore了,這樣分享的時候會被微信拒絕,微信會生成快取,就算你這會換了正式的keystore來分享顯示的還會是被微信拒絕,就算重啟微信重啟手機也不管用,那你就要清空微信的資料了;很多東西是不是丟了?好吧,囉嗦夠了,正式進入主題。

今天會提供如果實現微信分享,並且對怎麼成功接受回撥結果做一個詳細的介紹和教程,有回撥結果失敗的同學,往下看吧

首先就是要去開放平臺申請應用,稽核通過後會分配給你一個AppID:


下面我做了一個圖片、文字、URL的封裝,因為這幾個是最常用的對吧,如果還需要其他的分享型別,那麼你在這裡新增幾個方法就可以了,很方便修改:(想看下一步的同學,可以直接掠過程式碼往下看)

    /**
     * 分享文字
     *
     * @param shareContent 分享內容
     * @param type         分享型別,朋友圈、收藏、好友
     */
    public void shareText(String shareContent, ShareType type) {
        if (!TextUtils.isEmpty(shareContent)) {
            WXTextObject textObj = new WXTextObject();
            textObj.text = shareContent;

            WXMediaMessage msg = new WXMediaMessage();
            msg.mediaObject = textObj;
            // 傳送文字型別的訊息時,title欄位不起作用
            // msg.title = "Title";
            msg.description = shareContent;

            // 構造一個Req
            SendMessageToWX.Req req = new SendMessageToWX.Req();
            req.transaction = buildTransaction("text"); // transaction欄位用於唯一標識一個請求
            req.message = msg;
            req.scene = ShareType.getWechatType(type);
            sendReq(req);
        }
    }

    /**
     * 分享一個圖片
     *
     * @param shareBitmap 要分享的圖片
     * @param type        分享型別,朋友圈、收藏、好友
     */
    public void shareImage(Bitmap shareBitmap, ShareType type) {
        WXImageObject imgObj = new WXImageObject(shareBitmap);

        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;

        Bitmap thumbBmp = Bitmap.createScaledBitmap(shareBitmap, THUMB_SIZE, THUMB_SIZE, true);
        msg.thumbData = bmpToByteArray(thumbBmp);  // 設定縮圖

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("img");
        req.message = msg;
        req.scene = ShareType.getWechatType(type);
        sendReq(req);
    }

    /**
     * 分享一個網頁
     *
     * @param httpUrl     要分享的連線
     * @param type        分享型別,朋友圈、收藏、好友
     * @param iconRes     ICON
     * @param title       標題
     * @param description 描述
     */
    public void shareWebPage(String httpUrl, ShareType type, int iconRes, String title, String description) {
        Bitmap icon = BitmapFactory.decodeResource(Application.getInstance().getResources(), iconRes);
        shareWebPage(httpUrl, type, icon, title, description);
    }

    /**
     * 分享一個網頁
     *
     * @param httpUrl     連線
     * @param type        分享型別,朋友圈、收藏、好友
     * @param icon        連線前顯示的圖示
     * @param title       別人看到的標題
     * @param description 別人看到的描述
     */
    public void shareWebPage(String httpUrl, ShareType type, Bitmap icon, String title, String description) {
        WXWebpageObject webpage = new WXWebpageObject();
        webpage.webpageUrl = httpUrl;
        WXMediaMessage msg = new WXMediaMessage(webpage);
        msg.title = title;
        msg.description = description;
        msg.thumbData = bmpToByteArray(icon);

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("webpage");
        req.message = msg;
        req.scene = ShareType.getWechatType(type);
        sendReq(req);
    }

    /**
     * 得到Bitmap的byte
     *
     * @param bmp 圖片
     * @return 返回壓縮的圖片
     */
    private static byte[] bmpToByteArray(Bitmap bmp) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, output);

        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 構建一個唯一標誌
     *
     * @param type 分享的型別分字串
     * @return 返回唯一字串
     */
    private static String buildTransaction(String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }

如果你看了上面的方法的封裝,相比你一定看到了分享的方法都需要一個IWXAPI的引數,那麼現在就是要生成這個引數,在你分享之前或者在OnCreate的方法中可以:
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, Constants.WECHAT_APP_ID);

注意,應該使用
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, Constants.WECHAT_APP_ID);
而不是
mWxApi = WXAPIFactory.createWXAPI(context, Constants.WECHAT_APP_ID, false);
為什麼呢,原因在下面會解釋到。

其實現在已經可以分享成功了,但是我們怎麼知道是不是分享成功了呢?那就是要接受微信的分享結果回調了,我們需要提供一個專門的Activity,並且實現微信SDK的IWXAPIEventHandler介面

收不到微信的分享結果回撥?很多人在這裡就出問題了,我們的Activity實現了微信的IWXAPIEventHandler介面,但是收不到微信的回撥,那麼問題出在哪裡呢?且聽我細細道來

看過微信分享的demo的人就知道,微信接受的入口類在packagename.wxapi包下,它的分享結果回撥也在這個類,那麼我們實現這個IWXAPIEventHandler介面怎麼就不行呢?往下看

原來,我們在開放平臺註冊應用的時候要填包名,然後微信會在packagename.wxapi找這個回撥介面的類,並且這個類必須是集成了Activity的類,並且實現IWXAPIEventHandler介面,而且最重要的是:這個類的名字一定要是WXEntryActivity.java;這樣,你就可以接受到微信回撥結果了:

那麼注意的幾點總結出來就是:

1、我們必須有一個類繼承Activity,且實現微信SDK提供的IWXAPIEventHandler介面

2、實現IWXAPIEventHandler介面的Activity的檔名稱必須是:WXEntryActivity.java

3、這個WXEntryActivity.java類必須在packagename.wxapi包下,比如說我的程式包名是com.yoalnda.wechat,那麼這個檔案就放在com.yolanda.wechat.wxapi下

4、這個類WXEntryActivity.java在onCreate中

mWxApi = WXAPIFactory.createWXAPI(context, Constants.WECHAT_APP_ID, false);
		mWxApi.handleIntent(getIntent(), this);
上邊是生成解析回撥結果的wxapi物件,下面就是把接受到的Intent給wxapi這個物件,它會解析回撥結果,通過我們實現的IWXAPIEventHandler介面回撥給我們,這個介面有兩個方法,大家可以看我下面的程式碼就清楚了
5、不要忘記了onNewIntent這個方法,也要寫上,為了防止這個Activity處於棧頂的時候微信回撥我們

剛才 說到不能使用

IWXAPI wxapi = WXAPIFactory.createWXAPI(context, Constants.WECHAT_APP_ID, false);
下面就是原因,WXAPIFactory提供了兩個例項化WXAPI的方法,含有第三個Boolean引數的這個是接受回撥結果的時候用的,雖然前面用這個也可以成功。
/**
 * @author YOLANDA
 * @Time 2015年3月30日 下午4:55:56
 */
public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {

	/**分享到微信介面**/
	private IWXAPI mWxApi;
	/**分享結果資訊**/
	private TextView txtShareResult;
	/**分享結果圖片**/
	private ImageView imgShareResult;
	
	@Override
	protected void onActivityCreate(Bundle savedInstanceState) {
		setContentLayout(R.layout.activity_share2wechat_result);
		setBackButtonVisibility(true);
		
		mWxApi = WXAPIFactory.createWXAPI(context, Constants.WECHAT_APP_ID, false);
		mWxApi.registerApp(Constants.WECHAT_APP_ID);
		mWxApi.handleIntent(getIntent(), this);
	}
	
	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		setIntent(intent);
		mWxApi.handleIntent(intent, this);
	}

	/***
	 * 請求微信的相應碼
	 * @author YOLANDA
	 * @param arg0
	 */
	@Override
	public void onResp(BaseResp baseResp) {
		txtShareResult = (TextView) findViewById(R.id.txt_share2wechat_result);
		imgShareResult = (ImageView) findViewById(R.id.img_share2wechat_result);
		imgShareResult.setImageResource(R.drawable.operation_failed);
		setTitle("分享失敗");
		int result = 0;
		Log.i("錯誤號:" + baseResp.errCode + ";資訊:" + baseResp.errStr);
		switch (baseResp.errCode) {
		case BaseResp.ErrCode.ERR_OK:
			setTitle("分享成功");
			result = R.string.sharewechat_success;//成功
			imgShareResult.setImageResource(R.drawable.operation_succeed);
			break;
		case BaseResp.ErrCode.ERR_USER_CANCEL:
			result = R.string.sharewechat_cancel;//取消
			break;
		case BaseResp.ErrCode.ERR_AUTH_DENIED:
			result = R.string.sharewechat_deny;//被拒絕
			break;
		default:
			result = R.string.sharewechat_back;//返回
			break;
		}
		txtShareResult.setText(result);
	}

	/**微信主動請求我們**/
	@Override
	public void onReq(BaseReq baseResp) {
		try {
			Intent intent = new Intent(Application.getInstance(), MainActivity.class);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			Application.getInstance().startActivity(intent);
		} catch (Exception e) {
		}
	}
}

至此,微信分享和介面回撥結果都完成了。

相關推薦

Android利用SDK分享教程分享結果錯誤解決注意

在正式開始之前這裡要著囉嗦一下,進來的同學一定要看,在申請應用的時候要填一個簽名,這個簽名是由應用的簽名檔案keystore決定的,那麼你在填這個簽名的時候,一定要把你的應用用正式的keyStore生成apk,安裝到手機,然後用微信提供的獲取應用簽名的apk工具獲取你應用

小程式下拉選項輸入框

wxml: <view class='select_box'>     <view class='select' catchtap='selectTap'>         <text class='select_text'>{{sele

Android中的介面詳解機制:以ActivityAdapter傳遞資料為例。

首先解決啥是回撥: 我覺得這個例子比較好:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該

簡單粗暴教你在VUE中引入微SDK 呼叫分享、朋友圈分享、QQ分享......

寫在前面: 剛做了一個微信端的網頁,用到了微信分享,在網上看了好多的資料,發現好多文件都寫得雲裡霧裡,讓人看的頭疼。通過對很多大佬文章的綜合整理,才完成了微信分享的部分。所以我想著自己寫一篇文章,能讓看到我這篇文章的親們能夠清楚的明白在vue上怎麼使用微信分享SDK,能夠按照

android使用友盟實現第三方登入、分享以及無反應問題解決辦法

這裡介紹微信和新浪登入。微信登入和新浪登入都需要申請第三方賬號。可以參考官方文件http://dev.umeng.com/social/android/operation#2還是很清晰的。 新浪微博開放平臺http://open.weibo.com/有賬號就可以,經常刷微

iOS之 接入新浪SDK支付) 的坑(registerApp 的問題)

com .net symbols object type lan creat manager -o 最近在做一個 iOS 的 cocos2d-x 項目接入新浪微博 SDK 的時候被“坑”了,最後終於順利的解決了。發現網上也有不少人遇到一樣的問題,但是能找到的數量有限的解決辦

ASP.NET CORE下用盛派SDKopenid

open 頁面 try cloud fancybox 技術 article clas group 用CORE做項目用到微信的相關東西,聽說那個盛派微信SDK很火,自己弄了下,只是簡單的用用,用戶訪問頁面取微信openid

開發配置JSSDK註入權限驗證以及invalid signature簽名錯誤解決

工具 沒有 ans dem menus true 發現 bin ces 在微信開發中很多功能都要用到微信JSSDK,關於JSSDK的使用,微信官方的文檔已經比較詳細,一定要仔細去看文檔。 <script src="https://res.wx.qq.com/open

淺析支付:申請退款、退款介面、查詢退款

本文是【淺析微信支付】系列文章的第八篇,主要講解商戶如何處理微信申請退款、退款回撥、查詢退款介面,其中有一些坑的地方,會著重強調。 淺析微信支付系列已經更新七篇了喲~,沒有看過的朋友們可以看一下哦。 淺析微信支付:查詢訂單和關閉訂單 淺析微信支付:支付結果通知 淺析微信支付:統一下單介面

支付統一下單的坑跟地址程式碼示例

 這裡我是把微信裡的回撥dome 拿出來重寫了一下,  在配置回撥地址的時候,要確定你的回撥連結地址一定要能夠訪問,  裡面註釋的比較多- -是我自己測試用的 也可以拿來作為參考,  配合上面一篇我寫的統一下單dome文章作為 結合來做,

android整合環sdk出現app:transformClassesWithDexForDebug.” ---finished with non-zero exit value 2解決方法

android整合環信sdk出現app:transformClassesWithDexForDebug.” —finished with non-zero exit value 2解決方法 通常是架包衝突問題。 首先找到Gradle Scripts 然後找到 解決: impleme

H5支付完整版含PHP頁面

注意事項: 一,微信H5支付只能用在手機瀏覽器中,比如百度瀏覽器,UC瀏覽器等,不可以用在微信中,微信中只可以使用公眾號支付.要特別注意. 二,如果你的h5手機版網站加殼打包封裝成了APP,根據我們的測試,也可以使用微信h5支付.不過.據微信官方說,可能會提示商家引數格式有誤,請聯絡商家解決

小程式 the server responded with a status of 404 錯誤解決方法

微信小程式開發,剛剛接觸這個小程式,遇到了題目中的問題,也就是在WXSS中無法使用background-image這個功能 後來經過各種查終於找到了解決方法。 首先官方給的說明是:background-image:可以使用網路圖片,或者 base64,或者使用<im

IOS第三方支付onResp方法不被解決辦法

首先是關於關於IOS微信的支付分享或登入   成功調起客戶端操作之後,返回你的應用之後onResp:方法不被執行的問題。//這裡說明一下,上次的整合告訴大家在Appdelegate.m里加入如下兩個方

H5支付完整版含PHP頁面.程式碼精簡2018年2月

<?php $sj=date("Y-m-d H:i:s"); $userid=returnuserid($_SESSION["SHOPUSER"]); $uip=$_SERVER["REMOTE_ADDR"]; $money1=sqlzhuru($_POST[t1]); $bh=$ddbh=$_SES

java小程式支付退款函式

package com.pay;import java.util.Date;import java.util.Map;public class test {    /**     * 生成統一下單     * @throws Exception      */public s

iOS整合支付的一些坑:onResp不、只顯示一個確定按鈕、閃

iOS整合微信支付總體來說還是比較容易的(如果沒有那些坑的話),所有文件都在:    https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1甚至只要看:    https://pay.weixin.qq.com/w

網頁授權code請求多次的坑

在之前的專案裡需要用到微信授權,我也是一次第一次用,看著微信開發文件寫了,然後就掉進了一個坑裡。剛開始在授權頁面寫的微信授權連結:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5250b8b9d4cfd

企業號模式開通.net

企業號每個應用有普通模式和回撥模式兩種,普通模式直接開啟網頁,回撥模式可設定應用底部選單項、可增加互動開發、可把客戶端的操作事件傳給企業伺服器,企業伺服器做響應開發。 開通回撥模式,首先需要通過url的回撥驗證,那麼進入應用後臺設定項,設定好url、token、aes加密偏

支付開發本地接收非同步通知【實戰】

前言 最近在除錯微信相關的介面,但是由於微信官方出於安全的考慮,對於呼叫介面的域名有限制。微信授權與微信支付統一下單介面在本地