Android----微信支付

前言:

最近看了很多大牛的博客,发现别人写的非常好,但是实际的年龄和我也差不多,不提技术上的差距,他们的博客排版,行文的流水和语言的组织能力都很令我敬佩,为了向大牛靠拢,决定今年也好好写一写博客,提升自己。今天这篇文章是安卓实际开发技能必备第一篇,微信支付,下一篇是集成支付宝支付,希望大家能帮助到大家。

1.

在微信开放平台进行账户申请(点击打开链接),获取所需的appid。
这里写图片描述
按照提示进行填写相关信息。注意:在填写app签名的时候,不知道如何生成的网友可以(点击下载),下载后装进手机填写包名即可生成。填写好后等待腾讯审核,审核通过后会发现支付功能仍然还没有开通:
这里写图片描述
所以还需要进行相关信息的填写然后就是慢慢的等待!

2.

下载微信的jar包:我现在下载的是3.1.1版本,支持分享,收藏和支付。按照微信的接口文档进行下载和简单的集成。

3.代码编辑:

3.1:写 WXPayEntryActivity类,注意该类一定要在wxapi这个包名下,如图示:
这里写图片描述
为了方便我们新建一个WechatUtils类,代码如下:

public class WechatUtils {

    public WechatUtils() {}

    private static WechatUtils wechat;

    public static WechatUtils getInstance(){
        if(wechat==null){
            wechat=new WechatUtils();
        }
        return wechat;
    }

    private  WechatResponseListener mListener;//监听微信回调的接口

    public  WechatResponseListener  getListener() {
        return mListener;
    }

    public   void setListener(WechatResponseListener listener) {
        mListener = listener;
    }

    private  IWXAPI wechatapi;

    public  IWXAPI getWXAPi(Context context) {
        if (wechatapi == null) {
            wechatapi = WXAPIFactory.createWXAPI(context, Constants.APP_ID, false);
            wechatapi.registerApp(Constants.APP_ID);
        }
        return wechatapi;
    }

    //发送请求
    public  void sendReq(Context context,PayReq req){
        Log.i("ssssssssssssss","sendReq");
        // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
        if (!getWXAPi(context).isWXAppInstalled()) {
            getWXAPi(context).registerApp(Constants.APP_ID);
        }
        getWXAPi(context).sendReq(req);

    }

    //接收请求
    public  void setResponse(BaseResp baseResp){
        Log.i("ssssssssssssss",baseResp.errCode+"");
        switch (baseResp.errCode){
            case BaseResp.ErrCode.ERR_OK:
                if(mListener!=null){
                    mListener.ResponseOK("ERR_OK");
                }
                break;
            case BaseResp.ErrCode.ERR_COMM:
                if(mListener!=null){
                    mListener.ResponseERR_COMM("ERR_COMM");
                }
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                if(mListener!=null){
                    mListener.ResponseERR_USER_CANCEL("ERR_USER_CANCEL");
                }
                break;
        }
    }

    /**
     * @param context
     * @return
     * @功能描述:获取微信的版本是否支持支付
     * @返回类型:boolean:如果支持支付则返回true,不支持返回false!
     * @时间:
     */
    //INFO 微信/判断微信版本是否支持支付
    public  boolean getPaySupported(Context context) {
        int wxSdkVersion = getWXAPi(context).getWXAppSupportAPI();
        if (wxSdkVersion >= Build.PAY_SUPPORTED_SDK_INT) {
            return true;
        }
        return false;
    }

    /**
     * @return
     * @功能描述:获取是否安装微信
     * @返回类型:boolean:如果安装则返回true,没安装返回false!
     */
    //INFO 微信/判断是否安装微信
    public  boolean getOpenWXApp(Context context) {
        boolean installWX = getWXAPi(context).openWXApp();

        return installWX;
    }
}

WeChatResponseListener为回调监听接口,很简单,

public interface  WechatResponseListener {
    void response(BaseResp baseResp);

}

3.2下面来看最主要的类,WXPayEntryActivity:

public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler{
    // IWXAPI 是第三方app和微信通信的openapi接口
    private IWXAPI api;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //可以为这个activity设置界面,也可以不设置,不设置时就是默认的白色界面
        // 但是在onResp()方法中一定要记得finish()掉
//        setContentView(R.layout.activity_main_);
        // 通过WXAPIFactory工厂,获取IWXAPI的实例
        api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);

        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) {

    }

    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
    @Override
    public void onResp(BaseResp baseResp) {
        WechatUtils.getInstance().getListener().response(baseResp);
        this.finish();//记得finish()
    }
}

最后来看看MainActivity是如何做的:

public class MainActivity extends AppCompatActivity{
    private TextView tv_send;

    private String title = "";
    private String ordertype = "";
    private String tomemid="";
    private String price="";
    private String price_tbb = "";
    private String paytype = "";
    private String zfpass="";

    private String tokenid="";
    private String platform = "0";
    private  String responsestr="";

    private WechatUtils wechat;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_send= (TextView) findViewById(R.id.tv_send);
        wechat=WechatUtils.getInstance();

        tv_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getData();
            }
        });
    }

    private void getData(){

        Map<String, String> map = new HashMap<>();
        map.put("tradetype", "APP");
        map.put("title", title);
        map.put("ordertype", ordertype);
        map.put("tomemid", tomemid);
        map.put("price", price);
        map.put("price_tbb", price_tbb);
        map.put("paytype", paytype);
        map.put("zfpass", zfpass);

        PayRequestParam param=new PayRequestParam();
        param.setTradetype("APP");//用户名
        param.setTitle(title);
        param.setTomemid(tomemid);
        param.setPrice(price);
        param.setPrice_tbb(price_tbb + "");
        param.setOrdertype(ordertype);
        param.setPaytype(paytype);
        param.setZfpass(zfpass);
        param.setSign(PayUtils.getXfbSign(map));

        String str= JSON.toJSONString(param);

        PayRequestObject requestobject=new PayRequestObject();
        requestobject.setTokenid(tokenid);
        requestobject.setPlatform(platform);
        requestobject.setParam(param);

        String jsonstr=JSON.toJSONString(requestobject);

        String url ="";
        OkHttpClient client=new OkHttpClient();
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonstr);

        final Request request=new Request.Builder().url(url).post(requestBody).build();

            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.i("ssssssssssssss",e.toString()+"onFailure");
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    responsestr=response.body().string();
                    Log.i("ssssssssssssss",responsestr+"onResponse");
                    PayResponseObject object= (PayResponseObject) JSON.parseObject(responsestr,PayResponseObject.class);
                    PayResponseData data=object.getData();
                    final PayReq req=new PayReq();
                    req.appId =data.getAppid();
                    req.partnerId =data.getPartnerid();
                    req.prepayId =data.getPrepayid();
                    req.nonceStr =data.getNoncestr();
                    req.timeStamp =data.getTimestamp();
                    req.packageValue =data.getPackageStr();
                    req.sign =data.getSign();
                    wechat.sendReq(MainActivity.this,req);
                }
            });
    }

    @Override
    protected void onResume() {
        super.onResume();
       wechat.setListener(new WechatResponseListener() {
           @Override
           public void response(BaseResp baseResp) {
               Log.i("ssssssssssssss",baseResp.errCode+"");
               switch (baseResp.errCode){
                   case BaseResp.ErrCode.ERR_OK:
                       Toast.makeText(MainActivity.this,"ok",Toast.LENGTH_SHORT).show();
                       break;
                   case BaseResp.ErrCode.ERR_COMM:
                       Toast.makeText(MainActivity.this,"comm",Toast.LENGTH_SHORT).show();
                       break;
                   case BaseResp.ErrCode.ERR_USER_CANCEL:
                       Toast.makeText(MainActivity.this,"cancle",Toast.LENGTH_SHORT).show();
                       break;
               }

           }
        });
    }

}

这里面调用我们自己服务器的接口参数是自己定义的,但是返回的结果然后拼成PayRep是固定的,这里面网络请求用的事okhttp3,json解析用的事fastjson,在onresum里面进行回调监听支付结果
,errCode不同的值对应的意思可以参考微信文档。
3.3记得在manifest里面记得进行注册和一些权限的添加:
注册的时候记得一定要加:exported=”true”,同时添加:

  <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="wxbbcf236b07638282"/>
        </intent-filter>

4.

对App进行打包测试即可,没有签名打包的app是不能进行微信支付的。

欢迎下载源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值