Android实现微信支付的统一下单

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

本文实例为大家分享了Android实现微信支付统一下单的具体代码,供大家参考,具体内容如下

准备工作

申请微信开发者账号,添加应用及申请开通微信支付功能,如
查看开通流程

统一下单的接口文档:
查看接口

开发

①下载sdk:

sdk和demo下载

②可以导入包

在build.gradle文件中,添加如下依赖即可:

dependencies {
 compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}


dependencies {
 compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

③添加Android Manifest权限

<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"/>

调用统一下单接口

1.务必提交必须的字段:appid,body,mch_id,nonce_str,notify_url, out_trade_no,spbill_create_ip,total_fee,trade_type,sign(都是小写);提交到微信接口时以xml格式提交

2.sign为前面提交的参数按照参数名ASCII码从小到大排序签名拼接起来然后进行MD5运算,再将得到的字符串所有字符转换为大写得到的,如签名生成算法

3.参与生成sign的key为商户账号的密钥,key设置路径如下:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置

下面是具体代码(如若查看你的sign生成及提交的xml是否正确可以点击如下:签名生成工具

//拼接字段,顺序不能变
    String A = "appid=你的appID" +
      "&body=jinshi" +
      "&mch_id=你的商户号" +
      "&nonce_str=" + nonce_str +
      "&notify_url=http://www.szgsip.com/" +
      "&out_trade_no=" + trade_no +
      "&spbill_create_ip=192.168.1.1" +
      "&total_fee=1" +
      "&trade_type=APP";
    String key = "你的密钥";
    String temp = A + "&key=" + key;
 // 生成sign
     String sign = MD5.getMessageDigest(temp.getBytes()).toUpperCase();

接下来提交到微信下单的接口上

 private void httpThreadxml() {


  //组建xml数据
  //拼接字段,顺序不能变

  xml.append("<xml>\n");
    xml.append("<appid>你的appID</appid>\n");
    xml.append("<body>jinshi</body>\n");
    xml.append("<mch_id>你的商户号</mch_id>\n");
    xml.append("<nonce_str>" + nonce_str + "</nonce_str>\n");
    xml.append("<notify_url>http://www.szgsip.com/</notify_url>\n");
    xml.append("<out_trade_no>" + trade_no + "</out_trade_no>\n");
    xml.append("<spbill_create_ip>192.168.1.1</spbill_create_ip>\n");
    xml.append("<total_fee>1</total_fee>\n");
    xml.append("<trade_type>APP</trade_type>\n");
    xml.append("<sign>" + sign + "</sign>\n");
    xml.append("</xml>");

  try {
   final byte[] xmlbyte = xml.toString().getBytes("UTF-8");

   System.out.println(xml);

   URL url = new URL("https://api.mch.weixin.qq.com/pay/unifiedorder");


   final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setConnectTimeout(5000);
   conn.setDoOutput(true);// 允许输出
   conn.setDoInput(true);
   conn.setUseCaches(false);// 不使用缓存
   conn.setRequestMethod("POST");
   conn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
   conn.setRequestProperty("Charset", "UTF-8");
   conn.setRequestProperty("Content-Length",
     String.valueOf(xmlbyte.length));
   conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
   conn.setRequestProperty("X-ClientType", "2");//发送自定义的头信息


   conn.getOutputStream().write(xmlbyte);
   conn.getOutputStream().flush();
   conn.getOutputStream().close();


   if (conn.getResponseCode() != 200)
    throw new RuntimeException("请求url失败");

   InputStream is = conn.getInputStream();// 获取返回数据


   // 使用输出流来输出字符(可选)
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   byte[] buf = new byte[1024];
   int len;
   while ((len = is.read(buf)) != -1) {
    out.write(buf, 0, len);
   }
   String string = out.toString("UTF-8");
   System.out.println(string);

   Log.e("  微信返回数据 ", " --- " + string);
   out.close();


  } catch (Exception e) {

   System.out.println(e);
  }
}

注意在调用上面的方法,一定要在子线程中进行

new Thread(new Runnable() {
    @Override
    public void run() {
     httpThreadxml();
   }
 }).start();

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

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

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享

TextView显示系统时间(时钟功能带秒针变化

用System.currentTimeMillis()可以获取系统当前的时间,我们可以开启一个线程,然后通过handler发消息,来实时的更新TextView上显示的系统时间,可以做一个时钟的功能
收藏 0 赞 0 分享

Android用ListView显示SDCard文件列表的小例子

本文简单实现了用ListView显示SDCard文件列表,目录的回退等功能暂不讨论,获取文件列表,files即为所选择目录下的所有文件列表
收藏 0 赞 0 分享

Android拦截外拨电话程序示例

这篇文章主要介绍了Android拦截外拨电话的示例,大家参考使用吧
收藏 0 赞 0 分享

通过Html网页调用本地安卓(android)app程序代码

如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式
收藏 0 赞 0 分享

android Textview文字监控(Textview使用方法)

以手机号充值为例,当用户输入最后一位数时候,进行汇率的变换,本文就实现类似这样的功能
收藏 0 赞 0 分享

Android ListView长按弹出菜单二种实现方式示例

这篇文章主要介绍了Android ListView长按弹出菜单的方法,大家参考实现
收藏 0 赞 0 分享
查看更多