我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android—基于微信开放平台v3SDK开发(微信支付填坑)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android—基于微信开放平台v3SDK开发(微信支付填坑)

接触微信支付之前听说过这是一个坑,,,心里已经有了准备。。。我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束。。。进入正题

开发准备:

1.在微信开放平台申请账号

2.成功后创建应用,就是填一些看似很官方很正经的资料了。。。(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的)

3.微信支付是需要额外申请的:需要资料审核,账户验证,协议签署等步骤,(我记得,,资料审核要填写的东西好多,,,好多,,,账户验证就是你审核成功后微信会发送邮件到你   注册时登记的邮箱账号,其中含有随机金额用于账户验证,协议签署,略,太简单)一定要好好阅读你邮件的任何信息,因为有的细节错了,,,你可能填坑很久。。。。。。

正式开发阶段:

问题1:

调用官方的SDK发现只能成功的调起一次微信,再次支付的时候怎么也调用不起来了

解决:

似乎不是什么正经方法:在手机设置中管理应用程序,清除微信数据,缓存,,再来一遍,绝对可以调起来(当然还是只是一次。。。。)

继续:

我认为要用微信支付嘛,,就只看了调用支付接口的文档:
后来发现需要的参数prepayid是怎么也找不到啊,,后来才发现这个prepayid是先调用”统一下单“这个接口时候温馨反过来的东西,但是官方的SDK中并没有统一下单的代码。坑吗???

所以要先看统一下单文档了

1.使用自己的APP调用的时候把官网down下来的SDK中WXPayEntryActivity拷贝到自己的项目,所在包的名字最后一定是.wxapi(我连包一起拷了。。。。)

2.在项目清单文件中填写:

3.SDK中的AppRegister拷贝下来,,,里面换成你自己的appid,然后在项目清单中也注册一下。
4.重点来了,,就是你APP要调微信支付的activity,我这还叫PayActivity

要调起微信支付页面,要在这个activity中,将你的app注册到微信
 接下来先调用统一下单获取prepayid,参数,微信人家要xml格式的!我们就得发送xml格式的!
好了调用的时候把这个方法的返回值当参数传,,等待微信返回success吧!。。

 我遇见的错误:签名错误

我的原因是大意了 ConfigUtil.NOTIFY_URL这个参数写的空字符串

还有是因为debug版运行的,没有打包运行

返回成功之后,可以调用支付接口了

不要忘了这一步去跳转界面,,,,,

没有跳转到微信支付可能是你由运行的debug版本,,,,没有打包。。。。。

下面是我的PayActivity完整代码:


package com.example.taijiapp.ui;
import java.io.StringReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.xmlpull.v1.XmlPullParser;
import com.example.taijiapp.R;
import com.example.taijiapp.util.Constants;
import com.example.taijiapp.util.MD5;
import com.example.taijiapp.util.T;
import com.example.taijiapp.util.Util;
import com.example.taijiapp.utils.ConfigUtil;
import com.tencent.mm.sdk.modelpay.PayReq;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.widget.Button;
public class PayActivity extends Activity {
  PayReq req;
  private IWXAPI msgApi;
  Map<string, string=""> resultunifiedorder;
  StringBuffer sb;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pay);
    req = new PayReq();
    sb = new StringBuffer();
    msgApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
    
    boolean registerApp = msgApi.registerApp(Constants.APP_ID);
    T.show(this, "注册========"+registerApp+"");
    Button appayBtn = (Button) findViewById(R.id.appay_btn);
    Button check_pay_btn = (Button) findViewById(R.id.check_pay_btn);
    appayBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
        getPrepayId.execute();
      }
    });
    
    check_pay_btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        genPayReq();
        sendPayReq();
      }
    });
//   // 生成签名参数
//   Button appay_pre_btn = (Button) findViewById(R.id.appay_pre_btn);
//   appay_pre_btn.setOnClickListener(new View.OnClickListener() {
//
//     @Override
//     public void onClick(View v) {
//       genPayReq();
//     }
//   });
  }
  
  private String genPackageSign(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.KEY);
    Log.e("拼接=====", sb.toString());
    String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
    Log.e("orion生成签名===", packageSign);
    return packageSign;
  }
  
  public static String createSignNoKey(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('&');
    }
    String signStr = sb.toString();
    String subStr = signStr.substring(0, signStr.length() - 1);
    // 注意sign转为大写
    return MD5.getMessageDigest(subStr.getBytes()).toUpperCase();
  }
  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.KEY);
    this.sb.append("sign str\n" + sb.toString() + "\n\n");
    String appSign = MD5.getMessageDigest(sb.toString().getBytes());
    Log.e("orion", appSign);
    return appSign;
  }
  private String toXml(List<namevaluepair> params) {
    StringBuilder sb = new StringBuilder();
    sb.append("<xml>");
    for (int i = 0; i < params.size(); i++) {
      sb.append("<" + params.get(i).getName() + ">");
      sb.append(params.get(i).getValue());
      sb.append("<!--" + params.get(i).getName() + "-->");
    }
    sb.append("</xml>");
    Log.e("orion", sb.toString());
    return sb.toString();
  }
  private class GetPrepayIdTask extends AsyncTask<void, void,="" map<string,="" string="">> {
    private ProgressDialog dialog;
    @Override
    protected void onPreExecute() {
      dialog = ProgressDialog.show(PayActivity.this, getString(R.string.app_tip),
          getString(R.string.getting_prepayid));
    }
    @Override
    protected void onPostExecute(Map<string, string=""> result) {
      if (dialog != null) {
        dialog.dismiss();
      }
      sb.append("prepay_id\n" + result.get("prepay_id") + "\n\n");
      resultunifiedorder = result;
    }
    @Override
    protected void onCancelled() {
      super.onCancelled();
    }
    @Override
    protected Map<string, string=""> doInBackground(Void... params) {
      String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
      String entity = genProductArgs();
      Log.e("orion===发送过去", entity);
      byte[] buf = Util.httpPost(url, entity);
      String content = new String(buf);
      Log.e("orion", content);
      Map<string, string=""> xml = decodeXml(content);
      return xml;
    }
  }
  public Map<string, string=""> decodeXml(String content) {
    try {
      Map<string, string=""> xml = new HashMap<string, string="">();
      XmlPullParser parser = Xml.newPullParser();
      parser.setInput(new StringReader(content));
      int event = parser.getEventType();
      while (event != XmlPullParser.END_DOCUMENT) {
        String nodeName = parser.getName();
        switch (event) {
        case XmlPullParser.START_DOCUMENT:
          break;
        case XmlPullParser.START_TAG:
          if ("xml".equals(nodeName) == false) {
            // 实例化student对象
            xml.put(nodeName, parser.nextText());
          }
          break;
        case XmlPullParser.END_TAG:
          break;
        }
        event = parser.next();
      }
      return xml;
    } catch (Exception e) {
      Log.e("orion", e.toString());
    }
    return null;
  }
  
  private String genNonceStr() {
    Random random = new Random();
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
  }
  
  private long genTimeStamp() {
    return System.currentTimeMillis() / 1000;
  }
  
  private String genOutTradNo() {
    Random random = new Random();
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
  }
  
  public String getLocalIpAddress() {
    try {
      for (Enumeration<networkinterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
        NetworkInterface intf = en.nextElement();
        for (Enumeration<inetaddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
          InetAddress inetAddress = enumIpAddr.nextElement();
          if (!inetAddress.isLoopbackAddress()) {
            return inetAddress.getHostAddress().toString();
          }
        }
      }
    } catch (SocketException ex) {
    }
    return null;
  }
  private String getWifiIp() {
    // 获取wifi服务
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    // 判断wifi是否开启
    if (!wifiManager.isWifiEnabled()) {
      wifiManager.setWifiEnabled(true);
    }
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    String ip = intToIp(ipAddress);
    return ip;
  }
  
  private String intToIp(int i) {
    return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + (i >> 24 & 0xFF);
  }
  private String genProductArgs() {
    StringBuffer xml = new StringBuffer();
    String ip = getWifiIp();
    if (ip == "" && ip == "") {
      ip = getLocalIpAddress();
    }
    try {
      String nonceStr = genNonceStr();
      xml.append("");
      List<namevaluepair> packageParams = new LinkedList<namevaluepair>();
      packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));
      packageParams.add(new BasicNameValuePair("body", "APPtest"));
      packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
      packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
      packageParams.add(new BasicNameValuePair("notify_url", ConfigUtil.NOTIFY_URL));
      packageParams.add(new BasicNameValuePair("out_trade_no", genOutTradNo()));
      packageParams.add(new BasicNameValuePair("spbill_create_ip", ip));
      packageParams.add(new BasicNameValuePair("total_fee", "100"));
      packageParams.add(new BasicNameValuePair("trade_type", "APP"));
      String sign = genPackageSign(packageParams);
      packageParams.add(new BasicNameValuePair("sign", sign));
      String xmlstring = toXml(packageParams);
      return xmlstring;
    } catch (Exception e) {
      Log.e("TAG", "fail, ex = " + e.getMessage());
      return null;
    }
  }
  private void genPayReq() {
    req.appId = Constants.APP_ID;
    req.partnerId = Constants.MCH_ID;
    req.prepayId = resultunifiedorder.get("prepay_id");
    req.packageValue = "prepay_id=" + resultunifiedorder.get("prepay_id");
    req.nonceStr = genNonceStr();
    req.timeStamp = String.valueOf(genTimeStamp());
    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);
    sb.append("sign\n" + req.sign + "\n\n");
    Log.e("orion==genPayReq===============", signParams.toString());
  }
  private void sendPayReq() {
    boolean sendReq = msgApi.sendReq(req);
    T.show(this, "微信跳转====="+sendReq+"");
  }
}
</namevaluepair></namevaluepair></namevaluepair></namevaluepair></inetaddress></networkinterface></string,></string,></string,></string,></string,></string,></void,></namevaluepair></namevaluepair></namevaluepair></namevaluepair></string,>

里面没有的类,,,,呐:源码下载。自己下载一下拷贝一下。。。

参考文章://www.jb51.net/article/97712.htm

您可能感兴趣的文章:Android开发腾讯验证码遇到的坑Android开发中那些需要注意的坑Android开发手机无线调试的方法Android开发教程之获取系统输入法高度的正确姿势Android开发解决popupWindow重叠报错问题使用Win10+Android+夜神安卓模拟器,搭建ReactNative开发环境Android快速开发系列 10个常用工具类实例代码详解Android开发笔记之如何正确获取WebView的网页TitleAndroid开发图片水平旋转180度方法Android Studio中使用jni进行opencv开发的环境配置方法Android UI开发中所遇到的各种坑


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android—基于微信开放平台v3SDK开发(微信支付填坑)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android—基于微信开放平台v3SDK开发(微信支付填坑)

接触微信支付之前听说过这是一个坑,,,心里已经有了准备。。。我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束。。。进入正题 开发准备: 1.在微信开
2022-06-06

Android微信支付开发问题

并不是所有的BAT的API都是非常好用的,微信支付就有不少的缺陷,总结一下微信支付实现中出现的问题 坑点一: PayReq的参数 sign的生成 PayReq对象有个参数为packageValue 而sign生成时要用到pack
2022-06-06

Android开发微信APP支付功能的要点小结

基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置。 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置。 调试阶段,签名文件可以使用调试用的debug.keysto
2022-06-06

uniapp分享微信提示由于不支持的分享类型无法分享到微信,App分享为微信小程序方法,由于不支持的分享类型无法分享到微信,由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信.

文章目录 由于不支持的分享类型无法分享到微信(解决)由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信(解决)share:fail [Share微信分享:-3]Unable to send, https://ask.dcl
2023-08-20

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录