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是不能进行微信支付的。
欢迎下载源码
- android微信支付
- android微信支付
- Android 微信支付
- android微信支付
- android微信支付
- android微信支付
- Android 微信支付
- Android 微信支付
- android微信支付
- android 微信支付
- Android 微信支付
- android微信支付
- Android微信支付
- Android微信支付
- Android微信支付
- Android微信支付
- android微信支付
- Android微信支付
- 自定义RPC通讯框架,实现dubbo远程RPC服务治理功能
- 17 - 02 - 08 计算机网络(29)(Cookie)
- 【caffe源码研究】第四章:完整案例源码篇(1) :LeNetSolver初始化
- 去除掉浏览器对输入框的自动补全
- OpenMP入门程序
- Android----微信支付
- maven 工程启动找不到 Spring ContextLoaderListener 的解决办法
- Android 系列 2.9设置首次运行首选项
- windows10 oracle 00119 和 00132终于搞定了,太不容易了!
- sched_clock为什么要retry
- JAVA bean与XML互转的利器---XStream
- R--SVM支持向量机
- RxBus
- PHP代码优化细节