先上代码,后面会分析

  1. String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android";
  2. Button payBtn = (Button) findViewById(R.id.appay_btn);
  3. payBtn.setEnabled(false);
  4. Toast.makeText(PayActivity.this, "获取订单中...", Toast.LENGTH_SHORT).show();
  5. try{
  6. byte[] buf = Util.httpGet(url);
  7. if (buf != null && buf.length > 0) {
  8. String content = new String(buf);
  9. Log.e("get server pay params:",content);
  10. JSONObject json = new JSONObject(content);
  11. if(null != json && !json.has("retcode") ){
  12. PayReq req = new PayReq();
  13. //req.appId = "wxf8b4f85f3a794e77"; // 测试用appId
  14. req.appId = json.getString("appid");
  15. req.partnerId = json.getString("partnerid");
  16. req.prepayId = json.getString("prepayid");
  17. req.nonceStr = json.getString("noncestr");
  18. req.timeStamp = json.getString("timestamp");
  19. req.packageValue = json.getString("package");
  20. req.sign = json.getString("sign");
  21. req.extData = "app data"; // optional
  22. Toast.makeText(PayActivity.this, "正常调起支付", Toast.LENGTH_SHORT).show();
  23. // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
  24. api.sendReq(req);
  25. }else{
  26. Log.d("PAY_GET", "返回错误"+json.getString("retmsg"));
  27. Toast.makeText(PayActivity.this, "返回错误"+json.getString("retmsg"), Toast.LENGTH_SHORT).show();
  28. }
  29. }else{
  30. Log.d("PAY_GET", "服务器请求错误");
  31. Toast.makeText(PayActivity.this, "服务器请求错误", Toast.LENGTH_SHORT).show();
  32. }
  33. }catch(Exception e){
  34. Log.e("PAY_GET", "异常:"+e.getMessage());
  35. Toast.makeText(PayActivity.this, "异常:"+e.getMessage(), Toast.LENGTH_SHORT).show();
  36. }
  37. payBtn.setEnabled(true);

其核心action为:

  1. byte[] buf = Util.httpGet(url);
    httpGet方法的代码如下:
  1. public static byte[] httpGet(final String url) {
  2. if (url == null || url.length() == 0) {
  3. Log.e(TAG, "httpGet, url is null");
  4. return null;
  5. }
  6.  
  7. HttpClient httpClient = getNewHttpClient();
  8. HttpGet httpGet = new HttpGet(url);
  9.  
  10. try {
  11. HttpResponse resp = httpClient.execute(httpGet);
  12. if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
  13. Log.e(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());
  14. return null;
  15. }
  16.  
  17. return EntityUtils.toByteArray(resp.getEntity());
  18.  
  19. } catch (Exception e) {
  20. Log.e(TAG, "httpGet exception, e = " + e.getMessage());
  21. e.printStackTrace();
  22. return null;
  23. }
  24. }

这里本质上是一个http的get请求,返回json格式的字符串.

在发出的请求中会将订单和app的信息传给服务器.并调用手机中的微信app

支付完成后,会从服务器拿到支付返回结果.

腾讯是保证分布式事务的一致性的,根据返回结果代码就可以知道支付效果.

(原创)微信支付SDK调用的核心代码与分析(基于Android)的更多相关文章

  1. iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。

    这两天改版一个旧的APP,要旧貌换新颜,拿到app后进行编译,一直报下面的错误. 报不认识的符号名PayReq错误.奇怪,啥也没动就这样,真不知道给的包是不是本来就是个报错的工程. 不管怎样,要对它修 ...

  2. 开源微信支付SDK

    应该有一年多没在博客园上写文章了,毕竟是一个记录自己技术成长的平台,没能将写博客长期坚持下来,说起来也是挺惭愧的.对于自己的近况而言,确实平常加班也比较多,时间会比较压缩,所以到后来博客也基本停止了更 ...

  3. tp6中使用微信支付sdk

    一.下载微信支付sdk 二.将lib文件夹下的文件复制到目录:extend->WxPay 将example文件夹下的WxPay.Config.php文件也复制到:extend->WxPay ...

  4. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研

    想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...

  5. 【Unity】微信支付SDK官方安卓Demo的使用问题

    Unity3d使用微信支付是属于APP内发起支付调用的情况,其本质上是在安卓项目上使用微信SDK,安卓项目开发完成后再导入到Unity中作为Unity插件使用,即Unity中C#调用安卓(Java)代 ...

  6. Android微信支付SDK

    App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微 ...

  7. Unity接入微信支付SDK 2022年版安卓篇

    最近1年转了UE开发,博客更新的比较少,技术栈宽了不少,以后有空尽量多更新,也方便总结记忆 Unity接入微信支付整个过程坑比较多,网上之前的教程要么比较老,要么比较零碎,只能东拼西凑摸索,跑通后还是 ...

  8. Android微信支付SDK开发笔记

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...

  9. Android微信支付SDK开发

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...

随机推荐

  1. [LeetCode] Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  2. C语言中函数的传入值与传出值

    看到一个函数的原型后,怎么样一眼看出来哪个参数做输入哪个做输出? 函数传参如果传的是普通变量(不是指针)那肯定是输入型参数: 如果传指针就有 2 种可能性了,为了区别,经常的做法是: 如果这个参数是做 ...

  3. 关于Django 错误 查询之后结果序列化出现的问题is not JSON serializable

    由于查询出来的结果是instance (实例 /对象) 无法实例化, 在model结果加 .value()

  4. Mysql主从架构的复制

    复制类型 (1)基于语句的复制:  在主服务器上执行的SQL语句,在从服务器上执行同样的语句.MySQL默认采用基于语句的复制,效率比较高.  一旦发现没法精确复制时,会自动选着基于行的复制. (2) ...

  5. oracle新建登录用户sql语句

    CREATE TABLESPACE TEST_DBDATAFILE '/mnt/data/oracledata/TEST_DB .dbf' SIZE 5000M AUTOEXTEND ONUNIFOR ...

  6. 转:sublime上使用git连接github

    "工欲善其事,必先利其器." 这是古人的教诲,也是一个高效率的工程师需要遵循的法则之一.从大学开始写Java使用了JBuilder,Eclipse,后来写PHP用了Zend,写Ja ...

  7. 个人对B/S项目的一些理解(三)--Servlet与Strust

    以下是我自工作以来,结合对C/S项目的认知,对B/S项目的一些理解. 如有不足或者错误,请各位指正.   由于个人一开始入门时是ASP.NET MVC,是一个比较完善.完整的框架,下面仅对JAVA的w ...

  8. CSS样式表

    CSS样式及属性 样式标的基本概念 样式表的分类 1.内联样式表 和html联合显示,控制精确,但可重用性差,冗余多. 例:<p style="font-size:14px;" ...

  9. Ubuntu提示卷boot仅剩0字节的硬盘空间,解决办法

    查看当前安装的linux内核版本号 dpkg --get-selections |grep linux-image 查看当前使用的内核版本号 uname -a 卸载不需要的内核 sudo apt-ge ...

  10. 自制-随机生成不重复的数组 --算法,egret平台下的TS code

    感觉这个算法经常会用到,前段时间写过一次,现在push出来.原理是有两个数组,一个数组存放随机数,然后从另一个数组提取相关的数,然后把另一个数组的大小-1,remove掉这个数,unity里也是这个原 ...