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

Android第三方微信支付教程

程序员文章站 2024-03-05 16:00:43
做了微信支付,下载了demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题: 一、首先要在微信开发平台注册账号,新...

做了微信支付,下载了demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题:

一、首先要在微信开发平台注册账号,新增应用,填写正确的包名,正确的签名(md5中的一串字符冒号去掉,全部小写),当然也会生成的appid和appsecret都有用!最后还要花300大洋开通支付功能!

二、分析一下微信支付的流程

Android第三方微信支付教程

三、界面交互流程

Android第三方微信支付教程

上面都看明白了,接下来就是写代码了

四、这里必须要有wxapi这个包名,同时必须有wxpayentryactivity这个类名

Android第三方微信支付教程

五、在androidmanifest.xml里面配置相关信息

<uses-permission android:name="android.permission.internet"/> 
<uses-permission android:name="android.permission.access_network_state"/>

<uses-permission android:name="android.permission.access_wifi_state"/>

<uses-permission android:name="android.permission.read_phone_state"/> 
<uses-permission android:name="android.permission.write_external_storage"/>

 <!-- 启动主页面 -->
    <activity
      android:name=".ui.activity.mainactivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.main" />

        <category android:name="android.intent.category.launcher" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.view" />

        <category android:name="android.intent.category.default" />

        <data android:scheme="wx487898a262d23df3" />
      </intent-filter>
    </activity>


    <activity
      android:name=".wxapi.wxpayentryactivity"
      android:exported="true"
      android:label="@string/title_activity_wxpayentry"
      android:launchmode="singletop" />

    <receiver
      android:name=".wxpay.appregister"
      android:permission="com.tencent.mm.plugin.permission.send" >
      <intent-filter>
        <action android:name="com.tencent.mm.plugin.openapi.intent.action_refresh_wxapp" />
      </intent-filter>
    </receiver>

  /**
   * 首先调用接口,要把一些基本信息作为参数传给服务器
   * 比如:金额fee,用户id,标题title等
   * 调用成功之后会返回微信所需要的参数,如:
   * appid,noncestr,package,partnerid,prepayid,
   * timestamp,sign
   * 微信支付
   */
  stringbuffer sb = new stringbuffer();
  weixinpay wpay;
  private alertdialog mdialog;
  private alertdialog.builder builder;

  public void weixinpay() {
    // 通过wxapifactory工厂,获取iwxapi的实例
    api = wxapifactory.createwxapi(this, constants.app_id);
    // 将该app注册到微信
    api.registerapp(constants.app_id);
    // 调用接口
    params p = new params();
    p.put("fee",fee);
    p.put("spbill_create_ip", networkutils.getlocalipaddress(this));
    string value = "商品标题 " + title;
    try {
      string title = new string(value.getbytes("utf-8"));
      p.put("body", title);
    } catch (unsupportedencodingexception e) {
      e.printstacktrace();
    }

    p.put("userid", o.getuser().getid());

    p.post(c.url.weixin_pay, new rehandler() {

      @override
      public void onsuccess(netentity entity) {

        wpay = entity.toobj(weixinpay.class);

        payreq req = new payreq();
        req.appid = wpay.getappid();// 微信appid
        req.packagevalue = wpay.getpackagevalue();// 包
        req.extdata = "app data"; // optional
        req.timestamp = wpay.gettimestamp();// 时间戳
        req.partnerid = wpay.getpartnerid();// 商户号"
        req.prepayid = wpay.getprepayid();// 预支付订单号
        req.noncestr = wpay.getnoncestr();// 随机字符串
        req.sign = wpay.getsign();// 后台返回的签名

        // 本地再次签名
        list<namevaluepair> signparams = new linkedlist<namevaluepair>();
        signparams.add(new basicnamevaluepair("appid", req.appid));
        signparams.add(new basicnamevaluepair("noncestr", req.noncestr));
        signparams.add(new basicnamevaluepair("package",req.packagevalue));
        signparams.add(new basicnamevaluepair("partnerid",req.partnerid));
        signparams.add(new basicnamevaluepair("prepayid", req.prepayid));
        signparams.add(new basicnamevaluepair("timestamp",req.timestamp));
        req.sign = genappsign(signparams);

        // 调微信支付
        if(api.iswxappinstalled()&&api.iswxappsupportapi()){
          api.sendreq(req);
        }else{
          builder = new alertdialog.builder(wxpayentryactivity.this);
          builder.setneutralbutton("关闭",
              new dialoginterface.onclicklistener() {
                @override
                public void onclick(dialoginterface dialog, int which) {
                  mdialog.dismiss();
                }
              }).settitle("友情提醒").setmessage("请安装微信客户端");

          mdialog = builder.create();
          mdialog.show();
        }

      }

      @override
      public void onstart() {

      }

      @override
      public void onfailure(string message) {
      }
    });
  }

  private string genappsign(list<namevaluepair> params) {
    stringbuilder sb = new stringbuilder();

    for (int i = 0; i < params.size(); i++) {
      sb.append(params.get(i).getname());
      sb.append('=');
      sb.append(params.get(i).getvalue());
      sb.append('&');
    }
    sb.append("key=");
    sb.append(constants.api_key);

    this.sb.append("sign str\n" + sb.tostring() + "\n\n");
    string appsign = md5.getmessagedigest(sb.tostring().getbytes());
    log.e("orion", appsign);
    return appsign;
  }

六、在wxpayentryactivity类里面成功之后回调方法onresp()

@override
  public void onresp(baseresp resp) {
    log.d(tag, "onpayfinish, errcode = " + resp.errcode);

    if (resp.gettype() == constantsapi.command_pay_by_wx) {
      if(resp.errcode==-2){
        toast.maketext(this,"取消付款!", toast.length_long).show();
      }
      if(resp.errcode==-1){
        toast.maketext(this,"支付错误!", toast.length_long).show();
      }
      if(resp.errcode==0){
        queryorder();//查询接口调用后台服务器查询是否成功
      }

    }

最后做完之后,一定要签名打包,这个是微信的独家秘笈,你忘了就会跳出-1,呵呵。

最后总结一下支付返回-1的情况
1.检查微信后台的签名,包名是否正确
2.工程是否签名打包
3.如果之前做过测试显示过-1的情况,必须清除微信的清除数据,重新登录微信
4.后台服务器是否按照要求第一次签名,第二次签名,如果第二次签名不对,那我们就自己再次签名一次,我的代码里面写了

以上就是微信支付的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。