Android----微信支付

来源:互联网 发布:wpsexcel数据分析工具 编辑:程序博客网 时间:2024/06/04 23:29

前言:

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

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
原创粉丝点击