很多朋友第一次做微信支付的时候都有蒙,但当你完整的做一次就会发现其实并没有那么难

业务流程和应用场景官网有详细的说明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4,我就不做具体介绍了,我主要介绍一下作为开发的我们需要做的事情,微信官网要完成的部分我们就先不要考虑了

开发流程:

  1.获取用户授权,有两种形式:

  一种是snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid);另一种是:snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )

  2.调用统一下单接口获取预支付ID;(重点)

  3.H5调起微信支付的内置JS

  4.支付完成后,微信回调的处理,这里主要就是处理支付成功后自己项目的业务逻辑

获取统一下单接口所需参数:

  所需参数去哪里找其实官方也有具体说明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

  appid:微信支付分配的公众账号ID(企业号corpid即为此appId) 登陆微信公众号后台==>开发==>基本配置

  mch_id : 微信支付分配的商户号 ;  登陆位置公众号支付后台就可以看到

  device_info :设备号;可以为终端设备号(门店号或收银设备ID) PC网页或公众号内支付可以传"WEB"

  nonce_str:随机字符串,长度要求在32位以内;自己随机生成就行

    小科普一下:nonce=Number once 表示在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值

  sign:签名,官方详细描述:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3;

    这是小白们经常栽跟头的地方,不过不用担心,下面我会附上前面算法

  sign_type:签名类型,默认为MD5,支持HMAC-SHA256和MD5。

  body:商品简单描述信息,自定义即可

  out_trade_no:商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一;

  total_fee:订单总金额,注意单位为分

  spbill_create_ip:终端IP;APP和网页支付提交用户端ip

  notify_url:回调函数的通知地址,异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数,就是自己处理支付完业务的接口路径

  trade_type:交易类型,JSAPI 公众号支付;NATIVE 扫码支付;APP APP支付

  key  :密钥,签名时用,key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

  最方面的就是自己想了一个字符串,然后用MD5(其他加密方式也可以)加密成32位的字符串,重新设置。

调用统一下单接口:

  所需要的参数签名已经都有具体介绍了,这里我就直接上代码了

SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
packageParams.put("device_info", "WEB");
packageParams.put("body", "自定义描述信息");
packageParams.put("out_trade_no","商户系统内部订单号");
packageParams.put("total_fee","支付金额");
packageParams.put("spbill_create_ip", "终端IP");
packageParams.put("notify_url","回调地址url");
packageParams.put("trade_type","JSAPI");
packageParams.put("nonce_str", "随机字符串");
packageParams.put("sign","签名结果");

  统一下单接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder

  准备好数据后,封装成XML,调起统一下单接口,会返回一个XML格式数据 return_code为SUCCESS时,请求成功,获取我们需要的预支付id(prepay_id)这时就已经成功了一大半,可以稍作休息,犒劳一下自己了。

附上加密算法:传入上面准备的map数据

		StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" +密钥key);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();

为H5调起微信支付的内置JS 准备数据:

  这次的字段名和上次准备数据有所不一样

  appId:只是I大写,值还是一样的

     nonceStr:随机字符串,长度要求在32位以内;自己随机生成就行
        package:统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***
     timeStamp:时间戳

  signType:签名方式,默认MD5

  paySign:签名

        SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
packageParams.put("appId","商户号");
packageParams.put("timeStamp","时间戳");
packageParams.put("nonceStr","随机字符串");
packageParams.put("prepayid","前面得到的预支付id");
packageParams.put("package","prepay_id=前面得到的预支付id");
packageParams.put("signType","MD5");
packageParams.put("paySign","签名");

  如果所有配置都OK,就会弹出请输入密码的界面,反之提示目录未授权,这时候你就应该想时候配置授权目录了

  微信公众平台后台 ==> 微信支付 ==> 开发者配置,S API网页支付,然后添加系统后台的授权目录

  其他微信支付配置参考:https://jingyan.baidu.com/article/77b8dc7fef360d6174eab690.html

回调函数处理:

    1)解析传过来的流信息,通过重新签名的方式验证流中包含的信息的正确性。就是判断这个信息到底是不是微信发的

    2)return_code和result_code都是SUCCESS的话,处理商户自己的业务逻辑。就是订单的支付状态啊等一些信息。

    3)告诉微信,我收到你的返回值了。不用在发了。

Java 关于微信公众号支付总结附代码的更多相关文章

  1. java版微信公众号支付(H5调微信内置API)

    最近需要做微信公众号支付,网上找了大堆的代码,大多都只说了个原理,自己踩了太多坑,所有的坑,都会再下面的文章中标注,代码我也贴上最全的(叫我雷锋)!!! 第一步:配置支付授权目录 你需要有将你公司的微 ...

  2. java开发微信公众号支付(JSAPI)

    https://www.cnblogs.com/gopark/p/9394951.html,这篇文章写的已经很详细了. 下面写一下自己的思路: 1.首先下载demo,地址:https://pay.we ...

  3. 微信公众号支付开发全过程 --JAVA

    按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的 ...

  4. 到处是坑的微信公众号支付开发(java)

    之前公司项目开发中支付是用阿里的支付做的,那叫一个简单,随意:悲催的是,现在公司开发了微信公众号,所以我步入了全是坑的微信支付开发中... ------------------------------ ...

  5. 微信公众号支付备忘及填坑之路-java

    一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...

  6. 微信公众号支付(JSAPI)对接备忘

    0 说明 本文里说的微信公众号支付对接指的是对接第三方支付平台的微信公众号支付接口. 非微信支付官方文档里的公众号支付开发者文档那样的对接.不过,毕竟腾讯会把一部分渠道放给银行或有支付牌照的支付机构, ...

  7. 微信公众号支付调用chooseWXPay提示“errmsg choosewxpay fail”

    微信公众号支付一直提示“errmsg choosewxpay fail”,也没有提示具体错误信息,签名没有问题(签名验证地址:https://pay.weixin.qq.com/wiki/doc/ap ...

  8. 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法

    这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...

  9. 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发

    概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...

随机推荐

  1. ExtremeComponents源码解析(一)

    一.前言 因参与公司框架改造,在负责前端table组件选型时,原本选了jqGrid和Bootstraptable作为备选方案,评审会上,武哥提了EXtremeComponents,让我也去了解下,看下 ...

  2. [剑指Offer] 66.机器人的运动范围

    题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...

  3. JavaScript 语句标识符,变量周期,常见的HTML事件

    语句 描述 break 用于跳出循环. catch 语句块,在 try 语句块执行出错时执行 catch 语句块. continue 跳过循环中的一个迭代. do ... while 执行一个语句块, ...

  4. init只创建一次 只有父类的init创建servletContext的对象

    init只创建一次 只有父类的init创建servletContext的对象  如果重写父类的方法 但不显示调用父类的init 是不会创建servletContext对象的

  5. [HDU4532]湫秋系列故事——安排座位

    题面在这里 description 有\(n\)种颜色的小球,每种颜色的小球有\(a_i\)个: 要把它们摆成一排,求相邻小球颜色不相同的摆放方案数. 任意两个合理的安排方法,只要有一个位置的同学不同 ...

  6. BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 5391  Solved: 2181 [Submit][S ...

  7. CodeForces.158A Next Round (水模拟)

    CodeForces.158A Next Round (水模拟) 题意分析 校赛水题的英文版,坑点就是要求为正数. 代码总览 #include <iostream> #include &l ...

  8. iOS中产生随机数的方法

    利用arc4random_uniform()产生随机数 Objective-C 中有个arc4random()函数用来生成随机数且不需要种子,但是这个函数生成的随机数范围比较大,需要用取模的算法对随机 ...

  9. [10.18模拟赛] 序列 (DP)

    [10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...

  10. xml 通过正则抓取字段

    $str = '<xml> <appid><![CDATA[wxd49ea66070209a6e]]></appid> <bank_type> ...