`
1036225283
  • 浏览: 19083 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

微信支付--统一支付接口被坑经历

阅读更多

       今天来写点什么,就写微信支付吧。哥可是被微信支付接口给折腾惨了。

       大概从5月22好开始,进行微信开发,到现在也有个吧月了,老总要求3个月拿出微信会员系统,感觉有点悬,这两天又被微信支付给卡住了。

        为了童鞋们能少走弯路,特此公告天下,哪位童鞋微信支付遇到了问题,尽管留言。下面谈谈自己的被坑爹的过程。

        1.要使用微信支付,前提是开通微信支付功能(废话!),开通后,就可以拿到商户id和商户api密钥,有了这两个必须的东西,就可以调用微信统一支付接口,拿到微信预支付prepayid了.有了prepayid,就可以在网页中调用jsapi了。

        2.重点是怎么拿到prepayid呢?很简单,调用post请求道https://api.mch.weixin.qq.com/pay/unifiedorder地址就可以了,很简单吧。咋一看确实简单,但这里面隐藏了好几个坑。网上一搜,坑一大把,我就把我遇到的两个坑show一下好了

        3.要拿到peipayid,需要传递一组xml数据,对应java攻城狮来说,一般都会写个model,填充数据,然后将model转换为xml字符串,然后跟随post请求一起发送出去。

        4.在一组xml数据中,有一个签名,初次遇到的人肯定都会蒙。这个签名要怎么签呢,要把你所有要传递给服务器的数据进行处理。记住:是所有要传递给服务器(腾讯)的数据,除了sign这个数据外的所有数据。sign也要被传送到服务器端去。

        一般是这样的:

               private String appid;// 公众账号ID
               private String mch_id;// 商户号
               private String device_info;// 设备号
               private String nonce_str;// 随机字符串
               private String sign;// 签名
               private String body;// 商品描述
               private String detail;// 商品详情
               private String attach;// 附加数据

               ... ...

          将这些字段先进行排序,字典排序,直接调用Arrays.sort(String[]);这样就排序完了,然后再拼接成一个字符串,appid=123&mch_id=123......以此类推,最后在加上商品api密钥key=123.完了之后,进行md5转换,在这,我被坑了一把。

          原因很简单,我转换后的md5有时候是29位,而不是32位,这是因为我在讲md5二进制字节流转换为字符串的时候,没有处理字节中小于16的值。也就是应该在小于16的值前面加0,不加的话,md5的结果位数就不对

         5,我遇到的下一个坑,也很简单,但折腾了我很久。我将创建好的model转换为xml,使用的是以下代码:XStream xStream = new XStream();
        xStream.alias("xml", object.getClass());

         转换结果如下:

         

 <appid>xxxxxxxxxxxxx</appid>
  <mch__id>xxxxxxxxxxxx</mch__id>
  <nonce__str>1add1a30ac87aa2db72f57a2375d8fec</nonce__str>
  <sign>C939DCA5210FEDF5C9651412C966EA01</sign>
  <body>test</body>
  <out__trade__no>1ad41a30ac87aa2db72f57a2375d8fec</out__trade__no>
  <total__fee>1</total__fee>
  <spbill__create__ip>xxx.xx.xx.xx</spbill__create__ip>
  <notify__url>xxxxxxxxxxxxxxxx</notify__url>
  <trade__type>JSAPI</trade__type>
  <openid>xxxxxxxxxxx</openid>
</xml>
     乍一看,这是没有问题的,其实应该是这样的:
     <xml><appid><![CDATA[xxxxxxxxxxx]]></appid><mch_id><![CDATA[xxxxxxxxxx]]></mch_id><nonce_str><![CDATA[1add1a30ac87aa2db72f57a2375d8fec]]></nonce_str></xml>
       也就是说:只要是字符串,就得用<![CDATA[   ]]>包裹起来,整型数据不用包裹,没有其他型号的数据了,哈哈哈哈。
        很晚了,该睡觉了,祝各位攻城狮晚安
 
       后续:很多人找我问微信支付的事,可时间太久,很多细节我都记不住了,特此晒出代码,希望能帮助到各位!
 
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport"
    content="width=device-width, initial-scale=1.0,user-scalable=true">
<title>Bootstrap 模板</title>
<script src="../resource/jquery/jquery-2.1.1.min.js"></script>
<script type="text/javascript"
    src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
 
 
 
    wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '${config_appId}', // 必填,公众号的唯一标识
    timestamp: parseInt('${config_timestamp}'), // 必填,生成签名的时间戳
    nonceStr: '${config_nonceStr}', // 必填,生成签名的随机串
    signature: '${config_signature}',// 必填,签名,见附录1
    jsApiList: ['onMenuShareTimeline','chooseWXPay']
});
 
 
 
    wx.ready(function(){
     
      wx.chooseWXPay({
        timestamp: parseInt('${pay_timestamp}'), // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
        nonceStr: '${pay_nonceStr}', // 支付签名随机串,不长于 32 位
        package: '${pay_package}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
        signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
        paySign: '${pay_paySign}', // 支付签名
        success: function (res) {
        // 支付成功后的回调函数
            }
    });
});
    wx.error(function(res){
        alert(res);
    });
    </script>
</head>
<body>
    <div>
        config 参数
        <p>appid:${config_appId}</p>
        <p>timestamp: ${config_timestamp}</p>
        <p>nonceStr: ${config_nonceStr}</p>
        <p>signature: ${config_signature}</p>
    </div>
 
 
    <div>
        支付参数
        <p>timestamp: ${pay_timestamp}</p>
        <p>nonceStr: ${pay_nonceStr}</p>
        <p>package: ${pay_package}</p>
        <p>signType: ${pay_signType}</p>
        <p>paySign: ${pay_paySign}</p>
    </div>
</body>
 
</html>
分享到:
评论

相关推荐

    微信App 支付 PHP后台接口代码

    经历了上述5坑,相信你已经有想干死人的冲动,那么你以为这就结束了吗,还有最后一坑,那就是APP签名已经包名,一定要与开放平台中的一致,然而,即使一致了你以为又结束了吗,NO,如果你更改过开放平台中的签名,...

    微信支付文档

    API说明部分详细介绍了统一支付接口、通用通知接口、订单查询接口、APP端开发说明(包括初始化设置、注册APPID、用服务器返回的参数调起支付等),以及关闭订单接口、退款申请接口、退款查询接口和对账单接口等功能...

    Android App支付系列(一):微信支付接入详细指南(附官方支付demo)

    总的来说,接入微信支付需要经历资质申请、APP_ID/APP_KEY申请、支付能力申请以及代码集成四个主要步骤。在实际开发中,需要注意参数的正确传递,签名的生成,以及处理各种回调事件,确保支付流程的顺畅和安全性。...

    20190320-聚合支付API在线文档1

    《超赢聚合支付API在线文档1》是针对聚合支付接口的详细指南,主要涉及微信支付相关的功能和服务。本文档详细记录了接口的各个版本及其变更,同时也规定了接口的使用规则,包括签名验证、请求和响应格式等核心内容。...

    CL支付接口文档1

    CL支付接口文档1是草榴支付科技有限公司提供的一份详细说明文档,旨在帮助商家接入支付宝、微信等第三方支付平台的统一下单接口。这个接口允许商家通过HTTP GET方式提交请求,进行支付操作,并且支持UTF-8编码。文档...

    Java支付全家桶企业级各类支付手段一站式解决方案

    2. **支付接口与协议详解**:深入讲解当前主流支付平台(如支付宝、微信支付、银联等)提供的API接口及其使用方法,并探讨支付过程中涉及的安全协议和技术标准。 3. **安全性保障措施**:重点介绍如何通过加密技术、...

    基于微信小程序的旅游系统设计与实现.docx

    【微信小程序技术概述】 微信小程序,作为腾讯公司推出的一种轻量级应用开发平台,自2017年上线以来,迅速获得了广泛的关注和应用。它无需下载安装即可使用,为用户提供了便捷的“触手可及”的服务。微信小程序的...

    基于微信小程序的互联网教育学习平台的设计与实现.docx

    - **微信小程序API**: 在开发过程中,开发者需要熟练掌握微信小程序提供的API接口,包括用户授权接口、支付接口等。 - **前后端联动**: 小程序前端与后端服务(如Java服务器)之间需要紧密协作,确保数据准确传输和...

    联盟卡小程序 vjh_card 1.2.9.zip微信小程序模板源码

    微信小程序支持使用JavaScript、WXML(WeChat Markup Language)和WXSS(WeChat Style Sheets)进行编程,提供了一套完整的开发工具和API接口,可以实现与微信服务的深度集成,包括支付、用户授权、地理位置等。...

    旅游电子商务(1)概论.pptx

    1. 网上支付:随着互联网的发展,电子支付系统如支付宝、微信支付等在线支付平台成为主流。它们通过连接银行账户或信用卡,提供安全、快速的支付服务。网上支付简化了交易流程,提高了交易效率,但同时也需要解决...

    智慧医院医疗服务平台建设方案.docx

    - **统一支付平台**:支持多种支付方式,如微信支付、支付宝、银联等。 - **统一对账平台**:实现自动化的对账流程,减少人工干预。 - **统一监管平台**:监控支付过程,确保符合法律法规要求。 - **接口对接**...

    龙兵社区拼团社区团购小程序

    6. **支付系统集成**:为了实现在线交易,小程序需要接入微信支付或其他第三方支付平台,提供安全、便捷的支付方式。支付过程需要遵循相关的安全规范,确保用户资金安全。 7. **用户体验优化**:小程序设计注重用户...

    jsp网络购物

    这通常涉及到第三方支付平台(如支付宝、微信支付),需要调用其提供的API,处理支付请求、验证支付结果,并更新订单状态。 八、安全性与优化 1. 安全性:防止SQL注入、XSS攻击、CSRF攻击等,确保用户数据安全。...

    asp.net初步介绍

    3. **订单支付**:支持多种支付方式,如信用卡、支付宝、微信支付等,确保交易安全。 4. **售后服务**:提供退换货、维修、咨询等服务,保障消费者权益。 #### 启动电子商务网站的步骤 - **决定的理由**:旨在吸引...

    信管XXX班_学号_姓名-课程设计总结.doc

    学生需要理解第三方支付平台如支付宝、微信支付的API,学会如何在系统中安全地处理支付流程。 6. **物流与库存管理**:对于电商系统,物流跟踪和库存管理也是重要部分。学生需要学习如何设计相关模块,实现库存的...

    74cms 骑士人才系统 v4.1.23 正式版 人才招聘系统源码

    修复 下载简历,选微信支付,跳转页面问题 修复 下载简历/刷新职位,选支付宝支付,成功后回跳页面问题 修复 邀请注册加积分,需绑定手机或邮箱问题 修复 伪静态下,分页链接问题 修复 分站下,简历/职位搜索,关健...

    功能规格说明书1

    - 支付接口:集成第三方支付系统,实现在线预订和支付功能。 - 地图API:接入地图服务,提供地点定位和导航功能。 综上所述,“导游众评网”项目旨在通过详尽的功能规格说明书,构建一个集信息查询、用户评价、交流...

    java版斗地主源码-resume:恢复

    微信相关接口对接 支付宝相关接口对接 协助架构工程师完成服务容器化,并将服务从物理机迁移至Kubernetes,实现服务高可用以及平滑发布等。 将自己维护的大部分c#服务,用java重写。 营销活动开发 领券中心(优惠券...

    姚善良-简历-1.01

    用户中心项目则展现了他在身份认证、权限控制、日志管理等系统集成上的能力,他使用laravel、redis和OAuth2.0等技术,提供了统一的服务接口,简化了开发者的工作。 最后,金融曝光台项目中,姚善良负责后台数据接口...

Global site tag (gtag.js) - Google Analytics