欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

聊聊Android开发之微信支付不得不说的故事

程序员文章站 2022-05-09 20:38:03
聊聊Android开发之微信支付不得不说的故事 整个微信支付是挺复杂的,但是根据微信官方建议,Android客户端需要做的事情其实很少,就是调起支付,而支付之前的工作交给服务端,...

聊聊Android开发之微信支付不得不说的故事

整个微信支付是挺复杂的,但是根据微信官方建议,Android客户端需要做的事情其实很少,就是调起支付,而支付之前的工作交给服务端,包括生成预支付订单等等。。。

一、 个人总结的集成步骤及注意事项

看了官方文档可能还是有些小迷茫吧,或者是集成过程中各种各样的问题吧。。跟我我的步骤走吧。亲测可行。

引入资源包:现在AndroidStudio的话可以直接添加依赖即可,上面Android开发资源里面有介绍。

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
或者
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
在微信开放平台申请开发应用,上面Android端集成流程有介绍,主要是包名、应用签名的问题。 Android端调起微信支付,下面这段代码是调起微信支付的代码,req 是一个 对象,我们需要创建这个对象,并且给它的属性赋值,然后mWxapi.sendReq(req)
,那么这些值从哪里来的呢?是从我们的服务端来的,因为下单什么的都需要在服务端做!也就是说,我们先请求我们的服务器去下单,服务器调用微信api下单,然后我们的服务器会把我们调取支付方法需要的数据返回给我们的!这里就是 PayOrderBean 。所以,什么签名啊、时间戳啊我们统统不用管!只关心调取支付的方法,其他的不是我们客户端做的!
private void sendPayReq(PayOrderBean info){
        mWxapi = WXAPIFactory.createWXAPI(OrderActivity.this, info.getValue().getAppid());
        PayReq req = new PayReq();
        req.appId = info.getValue().getAppid();
        req.partnerId ="XXXXXXXXXX";
        req.prepayId = info.getValue().getPrepayid();//预支付id
        req.nonceStr = info.getValue().getNonce_str();//32位内的随机串,防重发
        req.timeStamp = String.valueOf(info.getValue().getTimeStamp());//时间戳,为 1970 年 1 月 1 日 00:00 到请求发起时间的秒数
        req.packageValue ="Sign=WXPay";
        req.sign = info.getValue().getSign();

        // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
        mWxapi.registerApp(info.getValue().getAppid());
        boolean b = mWxapi.sendReq(req);
        Global.showToast(b+"");
    }
做到这里,就可以调取微信支付了。。。试试吧 下面说一下回调,直接把Demo中的wxapi/WXPayEntryActivity.java拷到你的项目中,比如你的包名cn.demo.family ,那么这个java文件的路径应该是cn.demo.family.wxapi/WXPayEntryActivity.java
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

import cn.shundao.family.R;
import cn.shundao.family.base.Constant;

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       // setContentView(R.layout.pay_result);

        api = WXAPIFactory.createWXAPI(this, Constant.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) {
    }

    @Override
    public void onResp(BaseResp resp) {
        System.out.println("---resp1--"+resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//          AlertDialog.Builder builder = new AlertDialog.Builder(this);
//          builder.setTitle(R.string.app_tip);
//          builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
//          builder.show();
            System.out.println("---resp2--"+resp.errCode);
        }
    }
}
清单文件中注册

至此,微信支付集成完毕。

二、需要注意的地方

微信支付需要打签名包,不能用debug包。

如果调不起支付界面,请检查你的包名、应用签名、是否是签名包、PayReq 属性值对不对(尤其是商户号,别看是服务器返回来的跟你没关系,也可能本来就是错的……)等等。 WXPayEntryActivity.java这个文件别自己写了,直接把Demo中的复制过来,以防出错,你可以选择把setContentView(R.layout.pay_result);注释掉,就不用复制布局图片等资源进来的,还有onResp方法里的对话框,你都可以注释掉,但是其他的就不用动了!!! 最后一点,如果集成不成功,一定是你哪里写错了,冷静下面仔细看一看吧。