当前位置: 移动技术网 > IT编程>移动开发>Android > Android第三方微信支付教程

Android第三方微信支付教程

2019年07月24日  | 移动技术网IT编程  | 我要评论

cctv风云足球,淘宝抢拍,龙腾古武

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

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

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


三、界面交互流程

这里写图片描述

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

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

这里写图片描述

五、在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.后台服务器是否按照要求第一次签名,第二次签名,如果第二次签名不对,那我们就自己再次签名一次,我的代码里面写了

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网