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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GXH_APOLOGIZE/article/details/79560573

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

整个微信支付是挺复杂的,但是根据微信官方建议,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);
        }
    }
}
  • 清单文件中注册
       <activity android:name=".wxapi.WXPayEntryActivity"
                  android:exported="true"
                  android:launchMode="singleTop"/>
  • 至此,微信支付集成完毕。

    三、需要注意的地方
  • 微信支付需要打签名包,不能用debug包。

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

猜你喜欢

转载自blog.csdn.net/GXH_APOLOGIZE/article/details/79560573