android分享支付經驗分享
最近由於公司向弄一個新手推薦活動,因為是推薦活動,必須借用現在流行的社交軟體進行各種分享,只要形式有微信分享到好友或者朋友圈、QQ分享給好友或者空間、微博分享和簡訊分享等。下面我就跟大家一起聊下在分享的過程中所遇到的各種坑。本文來自於自己的經驗,不足的地方還請指正。首先說下我是怎麼實現的,然後給大家說下實現過程中應該注意的。
微信支付
1、`api = WXAPIFactory.createWXAPI(this, AppConfig.WEIXIN_PAY_ID, false);//註冊。第二個引數是我們在微信開放平臺申請的Pay_ID,第三個引數代表是否進行校驗。` 2、微信推薦我們從後臺生成訂單,然後再通過app調起微信進行支付,其實也可以App裡面就生成訂單,然後Appc裡面進行支付。兩種都是可行的,但是大多數App並不是簡簡單單的支付,可能還要資料庫入庫,或者進行一些其他的操作,通過後臺生成訂單就比較好,大家可以根據自己的需求,選擇適合自己的。 3、當訂單生成之後,我們需要拼接調起微信支付的請求PayReq:
PayReq request = new PayReq();
request.appId = object.getString("appId");
request.partnerId = object.getString("partnerId");
request.prepayId = object.getString("prepayId");
request.packageValue = object.getString("package");
request.nonceStr = object.getString("nonceStr");
request.timeStamp = object.getString("timeStamp");
request.sign = object.getString("sign");
api.sendReq(request);
通過api.sendReq(),我們就能調起微信進行支付啦。一般情況下還是比較容易調起的,如果沒反應,請檢查自己的APP_ID,然後在檢查一下自己的PayReq,然後在檢查一下,是否添加了必須的許可權。 4、微信成功調起,輸入密碼成功支付之後,如果我們想要知道微信支付的結果,就必須在應用包名下,新建一個wxapi的包,然後新建一個WXPayEntryActivity,重點注意包名和activity的名字不要寫錯,微信是通過包名加activity的名稱通過反射跳轉到該頁面。這樣還不夠,需要實現微信定義的IWXAPIEventHandler,重寫onResp和onReq,在onReq裡面我們可以對app傳送到微信的請求做些處理,在onResp我們可以接收到微信返回的結果。返回結果bean裡面的errCode比較簡單,0代表成功,-1代表失敗,-2代表取消。這樣還不夠,還要呼叫iwxapi.handleIntent(getIntent(), this)在能正真的接收到微信返回的訊息。如果沒能成功的接收到微信返回的訊息,依次檢查包名activity名是否與規定的不符,檢查是否在AndroidMianfest裡面註冊了activity,然後是否呼叫了iwxapi.handleIntent(getIntent(), this)。
以上就是微信支付的總結,主要注意:
1、許可權是否新增
2、wxapi和WXPayEntryActivity的包名是否正確
3、在 WXPayEntryActivity裡面是否呼叫了iwxapi.handleIntent(getIntent(), this)
微信分享
1、首先檢測手機是否安裝了微信,通過微信自定義的方法
IWXAPI api = WXAPIFactory.createWXAPI(context, AppConfig.WEIXIN_PAY_ID, false);
if (api.isWXAppInstalled() && api.isWXAppSupportAPI()) {
flag = true;
}
api.isWXAppInstalled()返回微信是否安裝,api.isWXAppSupportAPI()返回微信是否支援支付。
2、在初始化了api之後,我們需要把應用註冊到微信`api.registerApp(AppConfig.WEIXIN_PAY_ID);`
3、下面就是建立WXobject和wxMessage,說明文件上有具體的程式碼,分享文字,圖片,音訊等詳細程式碼,我就不一一重述了,大家自己去微信開放平臺檢視程式碼。通過api.sendReq(req)我們就能調起微信分享的介面。
4、跟微信支付一樣,我們 需要在wxapi包下面新建一個WXEntryActivity,並且實現IWXAPIEventHandler才能接收到是否分享成功。
**如果沒有分享成功,依次檢查:
1、分享之前時候註冊了應用到微信api.registerApp(AppConfig.WEIXIN_PAY_ID);
2、WXEntryActivity是否註冊了
3、是否添加了必要的許可權
4、微信分享 code=-6,一般是由於App簽名跟後臺的簽名不一致導致的。微信簽名不允許大小寫,不允許冒號,建議使用官方的簽名工具獲取簽名。**
QQ分享
1、首先匯入必須的mta_sdk.jar和open_sdk.jar
2、AndroidManifest裡面新增
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme=“tencent***********” />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
3、Tencent是QQ的入口,需要例項化Tencent:mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());
4、實現回撥:IUiListener,QQ的所有操作都是通過這個回撥的,如果要想接收到QQ的回撥,還需要重寫onActivityRes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Tencent.onActivityResultData(requestCode,resultCode,data,listener);
}
**如果沒有分享成功,依次檢查:
1、是否新增必要的許可權
2、是否在Manifest裡面註冊了必要的activity,重點注意的是 ,這裡以Tencent 開頭,後面的數字是自己申請的appkey,當初就是這裡沒有處理,導致QQ一直無法調起
3、如果分享成功,但是不能接收到回撥,檢查是否重寫了onActivityResult**
微博分享
微博裡面文件比較全,他涉及到的東西也非常多,我們移動app比較關注的是他的分享和登陸。
1、匯入jar包和so庫
2、在Manifest裡面新增:
<activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser" android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:windowSoftInputMode="adjustResize"></activity>
這是微博自帶的有個webview,當你手機沒有安裝微博的時候,可以通過H5實現分享和登陸。如果沒有註冊的話,當沒安裝微部落格戶端的時候,無法調起微博H5頁面;
3、實現IWeiboHandler.Response介面,用於接收微博分享的結果
4、例項化IWeiboShareAPI、註冊,處理微博分享 的結果:
mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(context.getApplicationContext(), AppConfig.WEIBO_APPID);
mWeiboShareAPI.registerApp();
mWeiboShareAPI.handleWeiboResponse(getIntent(), this);//處理微博分享的結果;
**如果沒有分享成功,一次檢查:
1、因為微博稽核比較嚴格,只有當稽核通過之後才能分享成功,有可能並不是你的程式碼問題,而是稽核沒有通過,導致分享失敗
2、在沒有安裝微博的情況下,不能跳到微博分享的H5,檢查Manifest裡面是否註冊了微博的H5 webview;
3、新增必須的許可權**
下面分享我自己寫的一個ShareUtils,裡面實現了QQ,微信,微博分享,大家可以自行下載對照。
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WebpageObject;
import com.sina.weibo.sdk.api.WeiboMessage;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.Utility;
import com.tencent.connect.common.Constants;
import com.tencent.connect.share.QQShare;
import com.tencent.connect.share.QzoneShare;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
/**
* Created by pzh on 16/9/8.
*/
public class ShareUtils {
private static final String PREFERENCES_NAME = "com_weibo_sdk_android";
private static final String KEY_UID = "uid";
private static final String KEY_ACCESS_TOKEN = "access_token";
private static final String KEY_EXPIRES_IN = "expires_in";
private static final String KEY_REFRESH_TOKEN = "refresh_token";
public static boolean isWeiXinInstallAndSupport(Context context) {
boolean flag = false;
IWXAPI api = WXAPIFactory.createWXAPI(context, AppConfig.WEIXIN_PAY_ID, false);
if (api.isWXAppInstalled() && api.isWXAppSupportAPI()) {
flag = true;
}
return flag;
}
/**
* @param context
* @param type 1:分享到朋友圈 2:分享到微信好友
* @param title 標題
* @param url 跳轉url
* @param imageId 圖片id
*/
public static void shareToWeChat(Context context, int type, String title, String url, int imageId) {
IWXAPI api = WXAPIFactory.createWXAPI(context, AppConfig.WEIXIN_PAY_ID);
api.registerApp(AppConfig.WEIXIN_PAY_ID);
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), imageId);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
bitmap.recycle();
WXWebpageObject webpageObject = new WXWebpageObject();
webpageObject.webpageUrl = url;
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = webpageObject;
msg.title = title;
msg.thumbData = bmpToByteArray(thumbBmp, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.message = msg;
req.transaction = System.currentTimeMillis() + "";
req.scene = type == 1 ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
api.sendReq(req);
}
/**
* @param context
* @param title 標題
* @param description 描述
* @param url 跳轉URL
* @param imageUrl 圖片連結
* @param callBack
*/
public static void shareToQQ(Tencent mTencent, Context context, String title, String description, String url, String imageUrl, IUiListener callBack) {
Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, description);
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, url);
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imageUrl);
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, App名字);
mTencent.shareToQQ((Activity) context, params, callBack);
}
/**
* @param context
* @param picLists 圖片arraylist,可以分享多張圖片
* @param title 標題
* @param description 描述
* @param url 跳轉url
* @param callBack
*/
public static void shareToZone(Context context, ArrayList<String> picLists, String title, String description, String url, IUiListener callBack) {
Tencent mTencent = Tencent.createInstance(AppConfig.QQ_APPID, context.getApplicationContext());
final Bundle params = new Bundle();
params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
params.putString(QzoneShare.SHARE_TO_QQ_TITLE, title);//必填
params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, description);//選填
params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, url);//必填
params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, picLists);
mTencent.shareToQzone((Activity) context, params, callBack);
}
/**
* @param context
* @param phoneNum 簡訊接受者電話號碼
* @param content 簡訊內容
*/
public static void shareToSms(Context context, String phoneNum, String content) {
Uri smsToUri = Uri.parse("smsto:" + phoneNum);
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra("sms_body", content);
context.startActivity(intent);
}
/**
* @param context
* @param resId 顯示圖片
* @param title 標題
* @param description 描述
* @param url 跳轉url
*/
public static void shareToWeibo(IWeiboShareAPI api, final Context context, int resId, String title, String description, String url) {
WebpageObject mediaObject = new WebpageObject();
mediaObject.identify = Utility.generateGUID();
mediaObject.title = title;
mediaObject.description = title;
TextObject textObject = new TextObject();
textObject.text = title;
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);
// 設定 Bitmap 型別的圖片到視訊物件裡 設定縮圖。 注意:最終壓縮過的縮圖大小不得超過 32kb。
mediaObject.setThumbImage(bitmap);
mediaObject.actionUrl = url;
mediaObject.defaultText = title;
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
weiboMessage.mediaObject = mediaObject;
weiboMessage.textObject=textObject;
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
// 用transaction唯一標識一個請求
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMessage;
// 3. 傳送請求訊息到微博,喚起微博分享介面
AuthInfo authInfo = new AuthInfo(context, AppConfig.WEIBO_APPID, "", AppConfig.SCOPE);
Oauth2AccessToken accessToken = readAccessToken(context.getApplicationContext());
String token = "";
if (accessToken != null) {
token = accessToken.getToken();
}
api.sendRequest((Activity) context, request, authInfo, token, new WeiboAuthListener() {
@Override
public void onWeiboException(WeiboException arg0) {
}
@Override
public void onComplete(Bundle bundle) {
// TODO Auto-generated method stub
Oauth2AccessToken newToken = Oauth2AccessToken.parseAccessToken(bundle);
writeAccessToken(context.getApplicationContext(), newToken);
}
@Override
public void onCancel() {
}
});
}
public static void writeAccessToken(Context context, Oauth2AccessToken token) {
if (null == context || null == token) {
return;
}
SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
SharedPreferences.Editor editor = pref.edit();
editor.putString(KEY_UID, token.getUid());
editor.putString(KEY_ACCESS_TOKEN, token.getToken());
editor.putString(KEY_REFRESH_TOKEN, token.getRefreshToken());
editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime());
editor.commit();
}
public static Oauth2AccessToken readAccessToken(Context context) {
if (null == context) {
return null;
}
Oauth2AccessToken token = new Oauth2AccessToken();
SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
token.setUid(pref.getString(KEY_UID, ""));
token.setToken(pref.getString(KEY_ACCESS_TOKEN, ""));
token.setRefreshToken(pref.getString(KEY_REFRESH_TOKEN, ""));
token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0));
return token;
}
public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
if (needRecycle) {
bmp.recycle();
}
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
文章寫得不好,歡迎大家吐槽:
我的郵箱:[email protected]