Android第三方微信支付教程

所属分类: 软件编程 / Android 阅读数: 831
收藏 0 赞 0 分享

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

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

更多精彩内容其他人还在看

老生常谈Android HapticFeedback(震动反馈)

下面小编就为大家带来一篇老生常谈Android HapticFeedback(震动反馈)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详谈OnTouchListener与OnGestureListener的区别

下面小编就为大家带来一篇详谈OnTouchListener与OnGestureListener的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android仿知乎悬浮功能按钮FloatingActionButton效果

前段时间在看属性动画,恰巧这个按钮的效果可以用属性动画实现,下面通过本文给大家分享adroid仿知乎悬浮功能按钮FloatingActionButton效果,需要的朋友参考下吧
收藏 0 赞 0 分享

解决Android V7后自定义Toolbar、ActionBar左侧有空白问题

这篇文章主要介绍的Android V7后自定义Toolbar、ActionBar左侧有空白问题的解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android常见控件使用详解

这篇文章主要为大家详细介绍了Android常见控件的使用方法,包括ProgressBar进度条控件、AlertDialog对话框控件等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android实现简洁的APP更新dialog数字进度条

这篇文章主要为大家详细介绍了Android实现简洁的APP更新dialog数字进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android 判断当前语言环境是否是中文环境

本文主要介绍了Android 判断当前语言环境是否是中文环境的方法。具有很好的参考价值。下面跟着小编一起来看下吧
收藏 0 赞 0 分享

详谈Android中Matrix的set、pre、post的区别

下面小编就为大家带来一篇详谈Android中Matrix的set、pre、post的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现登录界面记住密码的存储

这篇文章主要为大家详细介绍了Android SharedPreferrences实现登录界面记住密码的存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android 使用SharedPreferrences储存密码登录界面记住密码功能

Android存储方式有很多种,在这里所用的存储方式是SharedPreferrences, 其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,下面通过实例代码给大家讲解下,需要的朋友参考下吧
收藏 0 赞 0 分享
查看更多