准备工作这里就不说了,包括签约和申请APPID,附上微信开放平台APP开发步骤,不懂的同学可以参考这里:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

上面的步骤很详细,这里主要说下调起支付的注意事项。按照上面文档中说的商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。

相关代码如下:

/*** 商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。*///商品描述String body = "iphone6s";//随机字符串String nonce_str = ResourceUtil.createRandomString(32);//通知地址String notify_url = "http://www.weixin.qq.com/wxpay/pay.php";//商户订单号String out_trade_no = ResourceUtil.generateOutTradeNo(32);//总金额(单位分)int total_fee = 1;String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";String sign = SignUtil.signByMD5("appid=" + Constants.APP_ID + "&body=" + body + "&mch_id=" + Constants.MCH_ID + "&nonce_str=" + nonce_str + "¬ify_url=" + notify_url +"&out_trade_no=" + out_trade_no + "&spbill_create_ip=127.0.0.1" +"&total_fee=" + total_fee + "&trade_type=APP" + "&key=" + Constants.KEY).toUpperCase(Locale.getDefault());//参数以xml格式传递String entity = "<xml><appid>" + Constants.APP_ID + "</appid><mch_id>" + Constants.MCH_ID + "</mch_id><nonce_str>" + nonce_str +"</nonce_str><sign>" + sign + "</sign><body>" + body + "</body><out_trade_no>" + out_trade_no + "</out_trade_no><total_fee>" + total_fee + "</total_fee><spbill_create_ip>127.0.0.1</spbill_create_ip><notify_url>http://www.weixin.qq.com/wxpay/pay.php</notify_url><trade_type>APP</trade_type></xml>";   Log.d("entity", entity);payButton.setEnabled(false);Toast.makeText(PayActivity.this, "获取订单中...", Toast.LENGTH_SHORT).show();byte[] buf = Util.httpPost(url, entity);if (buf != null && buf.length > 0) {String content = new String(buf);Log.d("get server pay params:", content);OrderResult orderResult = ResourceUtil.parseXml(new ByteArrayInputStream(content.getBytes()));if (!TextUtils.equals(orderResult.getReturnCode(), "SUCCESS")) {Toast.makeText(PayActivity.this, orderResult.getReturnMsg(), Toast.LENGTH_SHORT).show();return;} if (!TextUtils.equals(orderResult.getResultCode(), "SUCCESS")) {Toast.makeText(PayActivity.this, orderResult.getErrorDesc(), Toast.LENGTH_SHORT).show();return;}//下单成功,调起支付PayReq request = new PayReq();request.appId = Constants.APP_ID;request.partnerId = Constants.MCH_ID;request.prepayId = orderResult.getPrepayId();request.packageValue = "Sign=WXPay";request.nonceStr = nonce_str;String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);request.timeStamp = timeStamp;request.sign = SignUtil.signByMD5("appid=" + Constants.APP_ID + "&noncestr=" + nonce_str + "&package=Sign=WXPay" +"&partnerid=" + Constants.MCH_ID + "&prepayid=" + orderResult.getPrepayId() + "×tamp=" + timeStamp + "&key=" + Constants.KEY).toUpperCase(Locale.getDefault());api.sendReq(request);payButton.setEnabled(true);}}
});

相关参数说明在文档上都注明了,我这里面nonce_str和out_trade_no都是我随机生成的字符创,附上我的工具类,方便大家参考。

ResourceUtil.java

package com.xylpay.sdk.pay.uikit;import java.io.IOException;
import java.io.InputStream;
import java.util.Random;import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;import com.xylpay.sdk.pay.bean.OrderResult;import android.util.Xml;public class ResourceUtil {/*** 随机生成字符串* @param length 字符串的长度* @return       随机字符串*/public static String createRandomString(int length) {String source = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";Random random = new Random();StringBuilder builder = new StringBuilder();for (int i = 0; i < length; i++) {int position = random.nextInt(source.length());builder.append(source.charAt(position));}return builder.toString();}public static String generateOutTradeNo(int n) {StringBuilder builder = new StringBuilder();Random random = new Random();for (int i = 0; i < n; i++) {builder.append(random.nextInt(10));}return builder.toString();}public static OrderResult parseXml(InputStream is) {//PULL解析xml数据XmlPullParser parser = Xml.newPullParser();OrderResult orderResult = null;try {parser.setInput(is, "UTF-8");int type = parser.getEventType();while(type != XmlPullParser.END_DOCUMENT) {switch (type) {case XmlPullParser.START_DOCUMENT:break;  case XmlPullParser.START_TAG:if (parser.getName().equals("xml")) {orderResult = new OrderResult();} else if (parser.getName().equals("return_code")) {orderResult.setReturnCode(parser.nextText());} else if (parser.getName().equals("return_msg")) {orderResult.setReturnMsg(parser.nextText());} else if (parser.getName().equals("result_code")) {orderResult.setResultCode(parser.nextText());} else if (parser.getName().equals("err_code_des")) {orderResult.setErrorDesc(parser.nextText());} else if (parser.getName().equals("prepay_id")) {orderResult.setPrepayId(parser.nextText());}break;  case XmlPullParser.END_TAG:  break; }type = parser.next();}} catch(XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return orderResult;}
}

其中关于sign的生成,参数的顺序一定要严格按照上面的顺序加上key进行MD5加密,查看签名规范。

关于key的说明,这里的key是需要自己生成然后配置到微信开放平台的,参考商户支付密钥key的生成与设置进行配置,两边需要保持一致。另外,下单时,参数要以xml的格式来传递。

最后附上自己的签名算法:

SignUtil.java

package com.xylpay.sdk.pay.uikit;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** Created by Jackie on 2016/2/15.*  * MD5加密*/
public class SignUtil {public static String signByMD5(String source) {byte[] bytes = null;try {MessageDigest digest = MessageDigest.getInstance("MD5");digest.update(source.getBytes());  //更新摘要bytes = digest.digest(); //再通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。} catch (NoSuchAlgorithmException e) {e.printStackTrace();}StringBuilder builder = new StringBuilder(bytes.length * 2);for (byte b : bytes) {/*** 0xFF默认是整形,一个byte跟0xFF相与会先将那个byte转化成整形运算*/if ((b & 0xFF) < 0x10) {  //如果为1位 前面补个0builder.append("0");}builder.append(Integer.toHexString(b & 0xFF));}return builder.toString();}
}

Android集成微信支付功能相关推荐

  1. Android集成微信支付

    Android集成微信支付 项目中集成第三方支付的功能,基本是我们app中经常用到的功能.今天先给大家讲一下微信支付的集成过程,重点只说一下代码部分.首先,你要到微信开发者平台注册账号,并创建你的应用 ...

  2. android自动微信支付平台,Android实现微信支付功能

    开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对 ...

  3. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...

    Android实现微信支付功能 开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要 ...

  4. Android 集成微信支付和支付宝支付工具类

    Android 集成微信支付和支付宝支付工具类 1.前言 去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步 ...

  5. Android 集成微信支付和支付宝

    最近比较闲,公司项目更换后台,于是自己来研究微信支付和支付宝支付,把自己学习的过程写下来,以备以后查看. 注:要集成微信支付和支付宝功能,必须要有以下几个配置信息,而这写信息需要公司去微信支付和支付宝 ...

  6. Android集成微信支付之-天坑

    项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 1 支付结果回调(图中的17步) 支付结果回调,微信官方的说法是: ...

  7. android微信迁移数据,【CSDN博客迁移】Android集成微信支付之-天坑

    项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 微信支付业务流程.png 1 支付结果回调(图中的17步) 支付结果 ...

  8. Android集成微信支付SDK,实现支付功能

    官方集成文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5# 一.在您 App Module 的 build.gra ...

  9. 微信支付 android4.4,Android集成微信支付

    我之前集成过Ping++这种第三方的支付,但没有单单针对微信官方的支付集成过,这次做遇到很多坑,记录下. 微信支付的过程: 首先在微信开放平台上申请AppID,在开放平台的应用管理中将你的应用启用支付 ...

最新文章

  1. webform里的验证控件
  2. 定制CE系统随笔-续1
  3. 依赖注入@Autowired@Primary@Quelifier使用
  4. mysql tree 修改_13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令
  5. WildFly Swarm:使用Java EE构建微服务
  6. php获取手机的mac地址,Android手机获取Mac地址的方法
  7. k8s使用volume将ConfigMap作为文件或目录直接挂载_Kubernetes in Action 06. 卷:将磁盘挂载到容器...
  8. 工程数学(数值分析)第四讲:插值逼近
  9. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作
  10. mysql start tran_mysql事务,START TRANSACTION, COMMIT和ROLLBACK,SET AUTOCOMMIT语法
  11. 钢铁雄心II HOI2 作弊码合辑
  12. 支付宝小程序获取外部任意小程序appId及页面路径(附常见appid)
  13. WebRTC的噪声抑制(noise suppression,NS)算法
  14. 20 个有用的 Go 语言微服务开发框架吐血总结!!!
  15. 鼠标移动让图片倾斜45度
  16. window.requestAnimationFrame讲解
  17. swiper禁止手动滑动
  18. 记一次hadoop namenode 启动失败问题及解决过程(启动几秒钟后又挂了)
  19. phpize的安装和使用
  20. DebugView使用方法

热门文章

  1. android一键拨号
  2. 秒杀微服务实现抢购代金券功能
  3. windows10 杀掉一个端口
  4. js求两个数的百分比
  5. Linux软件包管理-rpm、yum
  6. C语言中的 int** 是什么?这要从int* 和int 说起...
  7. hadoop分布式环境搭建
  8. python+opencv像素的加减和加权操作
  9. PTB-XL处理程序
  10. Microsoft Office PPT 编程(VBA)学习 (不定时更新,正在学习 ing)