美文网首页
android关于QQ、微信、支付宝接入

android关于QQ、微信、支付宝接入

作者: 名字不想带英文 | 来源:发表于2019-09-30 12: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);
            }
        }
    }

相关文章

网友评论

      本文标题:android关于QQ、微信、支付宝接入

      本文链接:https://www.haomeiwen.com/subject/nabcpctx.html