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