1、什么是[统一下单接口]?

首先我们要明白这个问题,需要先行看一下微信的官方文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

2.开发

 //微信支付,生成统一订单private void wxPay(String order_id) {String appid = WeChatInfo.WX_APP_ID;//app在微信申请的appidString mch_id = WeChatInfo.WX_MCH_ID;//申请支付功能的商户号String nonce_str = WeChatField.getRandomString();//随机码String body = "黄金月卡会员";//商品描述,随便写
//        String out_trade_no = UtilData.generateOrderSN();//订单编号String out_trade_no = order_id;//订单编号
//        (Math.Round((decimal)order.Amount * 100, 0)).ToString()String total_fee = "1";//总金额
//        String time_start = UtilData.getCurrentTime();//时间戳,格式yyyyMMddHHmmssString attach = "会员";//附加数据:深圳分店String trade_type = "APP";//交易类型String notify_url = "http://www.xxxx.net";//通知回调地址,然后后台做个回调,无参的,必须放到商户平台上配置添加String spbill_create_ip = WeChatField.getIPAddress(mContext);//设备ipSortedMap<String, String> params = new TreeMap<String, String>();params.put("appid", appid);params.put("mch_id", mch_id);params.put("nonce_str", nonce_str);params.put("attach", attach);params.put("body", body);params.put("out_trade_no", out_trade_no);params.put("total_fee", total_fee );params.put("trade_type", trade_type);params.put("notify_url", notify_url);params.put("spbill_create_ip", spbill_create_ip);XLog.e(XLog.getTag(),"---------out_trade_no:"+out_trade_no);//获取签名sign,文档有些参数是必须传的,但是少了还是能请求成功xmlString sign = WeChatField.getSign(params);//参数xml化String xmlParams = WeChatField.parseString2Xml(params, sign);XLog.e(XLog.getTag(),"------下单xml化---->" + "\n" + xmlParams);String urlStr = "https://api.mch.weixin.qq.com/pay/unifiedorder";//下单统一接口try {final byte[] xmlbyte = xmlParams.getBytes("UTF-8");URL url = new URL(urlStr);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){XLog.e(XLog.getTag(),"----------请求url失败-");return;}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);XLog.e("      微信返回数据   ", "  ---   " + string);out.close();is.close();String xmlStr = ((String) string);XLog.e(XLog.getTag(),"----result--->" + string);XLog.e(XLog.getTag(),"----下单返回--->" + "\n" + xmlStr);Map<String, String> map = WeChatField.decodeXml(xmlStr);Set set = map.entrySet();Iterator iterator = set.iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry) iterator.next();XLog.e(XLog.getTag(),"-----entry.getKey()/entry.getValue()---->" + entry.getKey() + "/" + entry.getValue());}if (map.get("return_code").equalsIgnoreCase("SUCCESS")) {if (map.get("return_msg").equalsIgnoreCase("OK")) {PayReq req = new PayReq();req.appId = WeChatInfo.WX_APP_ID;//APPIDreq.partnerId = WeChatInfo.WX_MCH_ID;//商户号req.prepayId = map.get("prepay_id");req.nonceStr = map.get("nonce_str");String time = System.currentTimeMillis() / 1000 + "";req.timeStamp = time;//时间戳,这次是截取long类型时间的前10位req.packageValue = "Sign=WXPay";//参数是固定的,写死的SortedMap<String, String> sortedMap = new TreeMap<String, String>();//一定要注意键名,去掉下划线,字母全是小写sortedMap.put("appid", WeChatInfo.WX_APP_ID);sortedMap.put("partnerid", WeChatInfo.WX_MCH_ID);sortedMap.put("prepayid", map.get("prepay_id"));sortedMap.put("noncestr", map.get("nonce_str"));sortedMap.put("timestamp", time);sortedMap.put("package", "Sign=WXPay");req.sign = WeChatField.getSign(sortedMap);//重新存除了sign字段之外,再次签名,要不然唤起微信支付会返回-1,特别坑爹的是,键名一定要去掉下划线,不然返回-1//进行支付doWxpay(req);} else {Toast.makeText(mContext, "签名失败", Toast.LENGTH_SHORT).show();}} else {Toast.makeText(mContext, "交易失败", Toast.LENGTH_SHORT).show();}} catch (MalformedURLException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}

WeChatField.class

public class WeChatField {/*** 解析返回的XML为键值对* @param content* @return*/public static 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) {XLog.e(XLog.getTag(),e.toString());}return null;}/**** 将键值对xml化* @param map* @param sign* @return*/public static String parseString2Xml(SortedMap<String, String> map, String sign) {StringBuffer sb = new StringBuffer();map.put("sign",sign);sb.append("<xml>");Set es = map.entrySet();Iterator iterator = es.iterator();while(iterator.hasNext()){Map.Entry entry = (Map.Entry)iterator.next();String k = (String)entry.getKey();String v = (String)entry.getValue();sb.append("<"+k+">"+v+"</"+k+">");}sb.append("</xml>");return sb.toString();}/*** 签名获得sign字段* @param params* @return*/public static String getSign(SortedMap<String, String> params) {StringBuffer sb = new StringBuffer();Set es = params.entrySet();Iterator iterator = es.iterator();while (iterator.hasNext()){Map.Entry entry = (Map.Entry) iterator.next();String key = (String) entry.getKey();String value = (String) entry.getValue();if (null != value && !TextUtils.isEmpty(value) && !key.equals("key")){sb.append(key + "=" + value + "&");}}sb.append("key="+WeChatInfo.WX_PRIVATE_KEY);//商品平台API密钥,32位的字母数字,找申请支付功能的人要,就在商户平台那里XLog.e(XLog.getTag(),"-------------------------------sign-------------->"+"\n"+sb.toString());String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();return packageSign;}/*** MD5加密* @return*/public static String getRandomString() {Random random = new Random();return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());}/**获取设备ip*/public static String getIPAddress(Context context) {NetworkInfo info = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();if (info != null && info.isConnected()) {if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//当前使用2G/3G/4G网络try {//Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();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() && inetAddress instanceof Inet4Address) {return inetAddress.getHostAddress();}}}} catch (SocketException e) {e.printStackTrace();}} else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//当前使用无线网络WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址return ipAddress;}} else {//当前无网络连接,请在设置中打开网络}return null;}/*** 将得到的int类型的IP转换为String类型** @param ip* @return*/public static String intIP2StringIP(int ip) {return (ip & 0xFF) + "." +((ip >> 8) & 0xFF) + "." +((ip >> 16) & 0xFF) + "." +(ip >> 24 & 0xFF);}}

PayReq.class

public class PayReq extends BaseReq {private static final String TAG = "MicroMsg.PaySdk.PayReq";private static final int EXTDATA_MAX_LENGTH = 1024;public String appId;public String partnerId;public String prepayId;public String nonceStr;public String timeStamp;public String packageValue;public String sign;public String extData;public PayReq.Options options;public String signType;public PayReq() {}public boolean checkArgs() {if (this.appId != null && this.appId.length() != 0) {if (this.partnerId != null && this.partnerId.length() != 0) {if (this.prepayId != null && this.prepayId.length() != 0) {if (this.nonceStr != null && this.nonceStr.length() != 0) {if (this.timeStamp != null && this.timeStamp.length() != 0) {if (this.packageValue != null && this.packageValue.length() != 0) {if (this.sign != null && this.sign.length() != 0) {if (this.extData != null && this.extData.length() > 1024) {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, extData length too long");return false;} else {return true;}} else {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, invalid sign");return false;}} else {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, invalid packageValue");return false;}} else {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, invalid timeStamp");return false;}} else {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, invalid nonceStr");return false;}} else {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, invalid prepayId");return false;}} else {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, invalid partnerId");return false;}} else {Log.e("MicroMsg.PaySdk.PayReq", "checkArgs fail, invalid appId");return false;}}public void toBundle(Bundle var1) {super.toBundle(var1);var1.putString("_wxapi_payreq_appid", this.appId);var1.putString("_wxapi_payreq_partnerid", this.partnerId);var1.putString("_wxapi_payreq_prepayid", this.prepayId);var1.putString("_wxapi_payreq_noncestr", this.nonceStr);var1.putString("_wxapi_payreq_timestamp", this.timeStamp);var1.putString("_wxapi_payreq_packagevalue", this.packageValue);var1.putString("_wxapi_payreq_sign", this.sign);var1.putString("_wxapi_payreq_extdata", this.extData);var1.putString("_wxapi_payreq_sign_type", this.signType);if (this.options != null) {this.options.toBundle(var1);}}public void fromBundle(Bundle var1) {super.fromBundle(var1);this.appId = a.b(var1, "_wxapi_payreq_appid");this.partnerId = a.b(var1, "_wxapi_payreq_partnerid");this.prepayId = a.b(var1, "_wxapi_payreq_prepayid");this.nonceStr = a.b(var1, "_wxapi_payreq_noncestr");this.timeStamp = a.b(var1, "_wxapi_payreq_timestamp");this.packageValue = a.b(var1, "_wxapi_payreq_packagevalue");this.sign = a.b(var1, "_wxapi_payreq_sign");this.extData = a.b(var1, "_wxapi_payreq_extdata");this.signType = a.b(var1, "_wxapi_payreq_sign_type");this.options = new PayReq.Options();this.options.fromBundle(var1);}public int getType() {return 5;}public static class Options {public static final int INVALID_FLAGS = -1;public String callbackClassName;public int callbackFlags = -1;public Options() {}public void toBundle(Bundle var1) {var1.putString("_wxapi_payoptions_callback_classname", this.callbackClassName);var1.putInt("_wxapi_payoptions_callback_flags", this.callbackFlags);}public void fromBundle(Bundle var1) {this.callbackClassName = a.b(var1, "_wxapi_payoptions_callback_classname");this.callbackFlags = a.a(var1, "_wxapi_payoptions_callback_flags");}}
}

定义订单编号

 /*** 要求外部订单号必须唯一。* @return*/public static String getOutTradeNo() {SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());Date date = new Date();String key = format.format(date);Random r = new Random();key = key + r.nextInt();key = key.substring(0, 15);return key;}

有什么不懂,欢迎留言;

统一订单接口,坑太多了,花了一天时间 搞定;

android 微信支付:统一下单接口获取相关推荐

  1. APP 对接 java 微信支付统一下单接口

    首先插入微信支付的时序图 统一下单时候的请求对象,需要把这个转为xml 文件格式所以需要在pom.xml 文件中导入 .和微信支付的sdk <dependency> <groupId ...

  2. 微信支付-----统一下单接口对接

    本以为没有机会接触鼎鼎大名的支付宝和微信接口(公司本身是做第三方支付的),最近由于一个售货机项目需要对接银联,支付宝和微信接口,因为我自身已经对接了银联,之后根据安排,由我对接微信的相关接口.话不多说 ...

  3. java微信支付 [统一下单接口] 与 [订单查询接口] 调用成功完整代码与结果

    公司最近要搞微信支付, 之前也没有做过, 但是搞过阿里云, 想来也不是很难. 在网上找了很多贴子, 在eclipse里做了5个测试工程, 没有测试成功, 后来下了微信SDK, 也做了个测试样例, 期间 ...

  4. php微信支付mch_id参数格式错误,在.net core上,Web网站调用微信支付-统一下单接口(xml传参)一直返回错误:mch_id参数格式错误...

    一.问题描述 在调用统一下单接口时,报mch_id参数格式错误,但商户ID确实是10位数字正确的,可就是一直报这个错误 返回的错误xml如下: 二.排错过程 1.多次对比官网xml格式,确认生成的xm ...

  5. 微信支付服务器system error,调用微信支付统一下单接口出现err_code:SYSTEMERROR错误...

    调用统一下单接口: 返回如下 {'appid': 'wxxxxxxxxx', 'err_code': 'SYSTEMERROR', 'err_code_des': 'system error', 'm ...

  6. 微信支付统一下单接口返回数据乱码

    做的一个网页扫码支付 微信公众号和商户号都已经申请号,密钥也配置了 验证签名通过,有的朋友问题会处在签名验证错误上,需要MD5加密设置编码格式为UTF-8 我的问题不在这里 统一下单后返回为fail ...

  7. 【微信支付统一下单】JAVA与XML请求内容体的双向映射

    在微信支付统一下单接口文档中,请求体body和微信端返回值都是xml格式的内容. 例如: <!-- 请求微信端的内容 ---> <xml><appid>wx2421 ...

  8. SpringBoot实现小程序微信支付统一下单

    SpringBoot实现微信支付统一下单 最近做小程序有需要用到微信支付,而在页面拉起微信支付前需要先进行统一下单,然后再返回参数给前端调用微信支付wx.requestPayment.网上参考了很多代 ...

  9. 微信V3 - 微信支付统一下单 --01

    准备工作: private static PrivateKey merchantPrivateKey; static { try { merchantPrivateKey = PemUtil.load ...

  10. 微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)

    微信支付 统一下单 字段 body 为中文时 报[签名错误]解决方案(C# SDK) 参考文章: (1)微信支付 统一下单 字段 body 为中文时 报[签名错误]解决方案(C# SDK) (2)ht ...

最新文章

  1. VS 常见快捷键(转)
  2. Sizzle 官方API翻译
  3. c语言矩阵乘法优化,c语言矩阵相乘
  4. 【机器学习】特征降维
  5. 【2017.11.29 周三 转载之李航博士的文章:大数据分析到底需要多少种工具?】...
  6. CAD数据与ArcGIS数据的互转换(转载)
  7. 深入理解JavaScript系列(32):设计模式之观察者模式
  8. 谷歌编码_如何通过学习编码赢得Google之旅
  9. JavaScript(四)字符串类型
  10. 华为虚拟服务器bim,bim云服务器
  11. 华硕飞行堡垒7在BIOS中开启AMD-V
  12. 英文电子书下载:salttiger.com
  13. MFC实现FTP客户端
  14. 技术驱动婚恋,百合网的混合云、大数据与机器学习实践
  15. NTP实现联网校对时间详解
  16. 活动|图观™数字孪生精品助推计划
  17. 获取与设置windows系统下音频设备音量
  18. ssm(day-01)
  19. 关于80端口和tomcat默认8080端口
  20. Python编程:从入门到实践pdf

热门文章

  1. 代码走查和代码审查_代码审查是个好主意的其他原因
  2. 广发99元旅游分期,来一场说走就走的旅行?
  3. Xshell免费版安装 常用连接linux工具
  4. 重启路由器可以换IP吗
  5. java实验计算机与光盘,JAVA实验指导资料.docx
  6. Geoda空间自相关分析—局部Moran‘I指数(运用GeoDa制作Lisa图)
  7. GEE、USGS、地理空间数据云上下载武汉地区的影像数据
  8. 应急响应(日志/流量)
  9. Chip Probe(CP)测试
  10. github安装python包_使用PyCharm从GitHub安装Python包