android关于QQ、微信、支付宝接入
2019-09-30 本文已影响0人
名字不想带英文
官文文档基本是写得很好,照着官方文档接入后还有问题再来对照下这文章就是
支付宝支付现在导入简单,直接在按官方文档说的在build.gradle加入导入就行(你避免不了要下载aar,所以还是自己去官网看下),就运用时代码要注意点
支付宝文档地址https://docs.open.alipay.com/204/105051/
下面是调起支付的代码
final String orderInfox = "";//订单消息,就生成这东西烦人,但为了安全起见是服务器按照支付宝那边规则生成传过来的,我们直接拿来用就行,所以支付宝的接入在android端并没有什么坑
Runnable pyRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask((Activity) context);
Map<String, String> result = alipay.payV2(orderInfox, false);//调起支付宝支付,拿到回调的消息
Message msg = new Message();
msg.what = 1;
msg.obj = result;
handler.sendMessage(msg);
}
};
Thread pyThread = new Thread(pyRunnable);
pyThread.start();
PayResult和ZhifubaoGsonBen都是用支付宝返回消息生成的对象类,名字什么的随意吧
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(Map<String, String> rawResult) {
if (rawResult == null) {
return;
}
for (String key : rawResult.keySet()) {
if (TextUtils.equals(key, "resultStatus")) {
resultStatus = rawResult.get(key);
} else if (TextUtils.equals(key, "result")) {
result = rawResult.get(key);
} else if (TextUtils.equals(key, "memo")) {
memo = rawResult.get(key);
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}
public class ZhifubaoGsonBen {
private AlipayTradeAppPayResponseBean alipay_trade_app_pay_response;
private String sign;
private String sign_type;
public AlipayTradeAppPayResponseBean getAlipay_trade_app_pay_response() {
return alipay_trade_app_pay_response;
}
public void setAlipay_trade_app_pay_response(AlipayTradeAppPayResponseBean alipay_trade_app_pay_response) {
this.alipay_trade_app_pay_response = alipay_trade_app_pay_response;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getSign_type() {
return sign_type;
}
public void setSign_type(String sign_type) {
this.sign_type = sign_type;
}
public static class AlipayTradeAppPayResponseBean {
private String code;
private String msg;
private String app_id;
private String auth_app_id;
private String charset;
private String timestamp;
private String total_amount;
private String trade_no;
private String seller_id;
private String out_trade_no;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getApp_id() {
return app_id;
}
public void setApp_id(String app_id) {
this.app_id = app_id;
}
public String getAuth_app_id() {
return auth_app_id;
}
public void setAuth_app_id(String auth_app_id) {
this.auth_app_id = auth_app_id;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getTotal_amount() {
return total_amount;
}
public void setTotal_amount(String total_amount) {
this.total_amount = total_amount;
}
public String getTrade_no() {
return trade_no;
}
public void setTrade_no(String trade_no) {
this.trade_no = trade_no;
}
public String getSeller_id() {
return seller_id;
}
public void setSeller_id(String seller_id) {
this.seller_id = seller_id;
}
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
}
}
处理支付宝的支付回调
@SuppressLint("HandlerLeak")
private static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
final PayResult payResult = new PayResult((Map<String, String>) msg.obj);
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
Gson gson = new Gson();
ZhifubaoGsonBen zhifubaoGsonBen = gson.fromJson(resultInfo, ZhifubaoGsonBen.class);
if (payResult.getResultStatus().equals("9000")) {//支付成功,但是为了保险起见,建议再把数据提交给服务器验证一遍
//将数据提交自己的服务器去验证
} else {
//支付失败
}
}
};
微信同样先导入(要注意的是微信只能在正式环境即你打包后的情况下才能正常运行)
文档位置:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html
https://pay.weixin.qq.com/wiki/doc/api/index.html
dependencies {
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
//微信官方申请的合法的App—id
public static final String APP_ID = "***********";
主要是要在项目包(项目申请微信功能时填的那个包)下创建wxapi包,然后在wxapi里创建文件WXPayEntryActivity(微信支付回调)、WXEntryActivity(微信登录|分享|小程序的回调)。
/**
* 单纯分享图片到微信
*
* @param type 1(好友)2(朋友圈)
* @param context
* @param imgPath 图片路径
*/
public static void shareWechatImg(int type, Activity context, String imgPath) {
IWXAPI iwxapi = WXAPIFactory.createWXAPI(context, BaseApplication.APP_ID);
iwxapi.registerApp(BaseApplication.APP_ID);
WXImageObject imgObj = new WXImageObject();
// 设置文件的路径
imgObj.setImagePath(imgPath);
// 第三步:创建WXMediaMessage对象,并包装WXimageObjext对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
// 第四步:压缩图片
Bitmap bitmap = BitmapFactory.decodeFile(imgPath);
Bitmap thumBitmap = Bitmap.createScaledBitmap(bitmap, 80, 80, true);
// 释放图片占用的内存资源
bitmap.recycle();
msg.thumbData = bmpToByteArray(thumBitmap, true);//压缩图
// 第五步:创建SendMessageTo.Req对象,发送数据
SendMessageToWX.Req req = new SendMessageToWX.Req();
// 唯一标识
req.transaction = String.valueOf(System.currentTimeMillis());
// 发送的内容或者对象
req.message = msg;
if (type == 2) {
req.scene = WXSceneTimeline;
} else {
req.scene = WXSceneSession;
}
iwxapi.sendReq(req);
}
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
private Intent intent_zhifu;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.acrivity_wx);
api = WXAPIFactory.createWXAPI(this, BaseApplication.APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
/**
* 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
* arg0。errCode 0成功 -1支付失败 -2取消
*/
@Override
public void onResp(BaseResp resp) {
LogUtil.i("支付返回码"+resp.errCode);
if (resp.errCode == 0) {//支付成功
//PayHelper.Success();
finish();
} else if (resp.errCode == -1) {//支付失败
PayHelper.Faile();
Toast.makeText(getApplicationContext(), "支付失败", Toast.LENGTH_SHORT).show();
finish();
} else {//取消
Toast.makeText(getApplicationContext(), "支付取消", Toast.LENGTH_SHORT).show();
finish();
}
}
}
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, BaseApplication.APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
/**
* 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
* arg0。errCode 0成功 -1支付失败 -2取消
*/
@Override
public void onResp(final BaseResp resp) {
LogUtil.i("baseResp:" + resp.errStr + "," + resp.openId + "," + resp.transaction + "," + resp.errCode);
Bundle bundle = getIntent().getExtras();
SendAuth.Resp sendresp = new SendAuth.Resp(bundle);
if (resp.errCode == 0) {//分享成功
if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
//登陆结果回调
getUserMsg(sendresp.code);
finish();
} else if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX) {
// ShareHelper.Share(1);
Toast.makeText(WXEntryActivity.this, "分享成功", Toast.LENGTH_SHORT).show();
finish();
}
} else if (resp.errCode == -1) {//分享失败
Toast.makeText(getApplicationContext(), "分享失败", Toast.LENGTH_SHORT).show();
finish();
} else {//取消
Toast.makeText(getApplicationContext(), "分享取消", Toast.LENGTH_SHORT).show();
finish();
}
}
private void getUserMsg(String code) {
//微信登录成功获取登录用户token,链接是:"https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +BaseApplication.APP_ID + "&secret=22344c3b934cd05461f5521e06522015&code=" + code +"&grant_type=authorization_code"
//再用那token去请求登录用户的个人信息,获取个人用户信息的链接为:"https://api.weixin.qq.com/sns/userinfo?access_token=" + token + "&openid=" + openid
}
}
同时要在AndroidManifest.xml中添加
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="xxxxxxxxxxx" /> <!-- 需修改 -->
</intent-filter>
</activity>
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
微信的调起,WxPayGsonBean 的对象类在下面
private static void WxPay(Context context) {
final String str = "服务器传过来的订单数据";
WxPayGsonBean wxPayGsonBean = BaseApplication.getGson().fromJson(str, WxPayGsonBean.class);
IWXAPI iwxapi = WXAPIFactory.createWXAPI(context, BaseApplication.APP_ID);
iwxapi.registerApp(BaseApplication.APP_ID);
PayReq request = new PayReq();
request.appId = wxPayGsonBean.getAppid();
request.partnerId = wxPayGsonBean.getPartnerid();
request.prepayId = wxPayGsonBean.getPrepayid();
request.packageValue = "Sign=WXPay";
request.nonceStr = wxPayGsonBean.getNoncestr();
request.timeStamp = wxPayGsonBean.getTimestamp() + "";
request.sign = wxPayGsonBean.getSign();
iwxapi.sendReq(request);
}
public class WxPayGsonBean {
private String appid;
private String noncestr;
@SerializedName("package")
private String packageX;
private String partnerid;
private String prepayid;
private String sign;
private int timestamp;
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getNoncestr() {
return noncestr;
}
public void setNoncestr(String noncestr) {
this.noncestr = noncestr;
}
public String getPackageX() {
return packageX;
}
public void setPackageX(String packageX) {
this.packageX = packageX;
}
public String getPartnerid() {
return partnerid;
}
public void setPartnerid(String partnerid) {
this.partnerid = partnerid;
}
public String getPrepayid() {
return prepayid;
}
public void setPrepayid(String prepayid) {
this.prepayid = prepayid;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public int getTimestamp() {
return timestamp;
}
public void setTimestamp(int timestamp) {
this.timestamp = timestamp;
}
}
微信分享照着文档来就是
QQ分享照着文档走就是,记住qq想要有回调必须在调用的qq分享的的Activity中添加
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Tencent.onActivityResultData(requestCode, resultCode, data, shareListen);
if (requestCode == Constants.REQUEST_API) {
if (resultCode == Constants.REQUEST_QQ_SHARE ||
resultCode == Constants.REQUEST_QZONE_SHARE ||
resultCode == Constants.REQUEST_OLD_SHARE) {
Tencent.handleResultData(data, shareListen);
}
}
}