@[clownss] java开发微信付款码支付

微信支付–付款码支付

写在前面的话,各位大佬,晚上好!今儿是小弟第一次发表博客,我是一名刚入行的程序员,写的不好或是不对的地方,希望各位见谅。还请各位大佬能够指导,给予小弟一份帮助。谢谢大家!今天写的是我最近研究的微信付款码支付的一个小demo。
官方地址:https://pay.weixin.qq.com/wiki/doc/api/index.html

1.支付方式

微信官方提供了以下几种支付方式:

  • 付款码支付:用户打开微信钱包-付款码的界面,商户扫码后提交完成支付

  • JSAPI支付:用户通过微信扫码、关注公众号等方式进入商家H5页面,并在微信内调用JSSDK完成支付

  • Native支付:用户打开“微信扫一扫”,扫描商户的二维码后完成支付

  • H5支付:用户在微信以外的手机浏览器请求微信支付的场景唤起微信支付

  • 小程序支付:用户在微信小程序中使用微信支付的场景

    我这里只是讨论的是 付款码支付

2.准备参数

微信付款码开发需要准备:appid,商户号,密钥

  • appid(公众账号ID )微信分配的公众账号ID(企业号corpid即为此appId)
  • mch_id (商户号 )微信支付分配的商户号
  • key(密钥)微信API密钥

2.1付款码支付开发流程

  • 第一步需要注册微信公众号,在微信公众号里面微信回给我们分配的开发者ID(AppID) 以及开发者密码(AppSecret) ,这两个需要我们妥善保管。appid在微信开发的几种模式都需要用到。

  • 第二步就是需要注册商户号了,这里注册就比较严格了。商户平台会给我们分配商户号(mch_id )

  • 第三步设置API密钥,简单流程就是:安装操作证书 -> 设置API密钥

    操作指引:可参考http://kf.qq.com/faq/161222NneAJf161222U7fARv.html

3.代码实现(简单开发)

这里主要写我在开发过程中具体实现,一个简单的jsp+servlet开发,需要下载官方的demo。

  • 到maven仓库下载需要的jar包wxpay-sdk-0.0.3.jardom4j-1.6.1.jar放到我们的项目中
  • 编写IWXPayDomain接口,官方demo里面也有这个接口
/*** 域名管理,实现主备域名自动切换*/
public interface IWXPayDomain {/*** 上报域名网络状况* @param domain 域名。 比如:api.mch.weixin.qq.com* @param elapsedTimeMillis 耗时* @param ex 网络请求中出现的异常。*           null表示没有异常*           ConnectTimeoutException,表示建立网络连接异常*           UnknownHostException, 表示dns解析异常*/void report(final String domain, long elapsedTimeMillis, final Exception ex);/*** 获取域名* @param config 配置* @return 域名*/DomainInfo getDomain(final WXPayConfig config);class DomainInfo{/*** 域名*/public String domain;/*** 该域名是否为主域名。例如:api.mch.weixin.qq.com为主域名*/public boolean primaryDomain;public DomainInfo(String domain, boolean primaryDomain) {this.domain = domain;this.primaryDomain = primaryDomain;}@Overridepublic String toString() {return "DomainInfo{" +"domain='" + domain + '\'' +", primaryDomain=" + primaryDomain +'}';}}
}
  • 编写MyConfig 类实现微信sdk里面的WXPayConfig 接口,这里面主要是准备我们自己的参数,就是上面准备的appid商户号密钥
public class MyConfig implements WXPayConfig {/** 加载证书  这里证书需要到微信商户平台进行下载*/private byte[] certData;public MyConfig() throws Exception {//证书只是撤销订单时会使用,在这里的demo中没有用到/*String certPath = "自己商户平台下载的证书";File file = new File(certPath);InputStream certStream = new FileInputStream(file);this.certData = new byte[(int) file.length()];certStream.read(this.certData);certStream.close();*/}/*** 设置自己的appId ,商户号,密钥* @return*/@Overridepublic String getAppID() {return "自己的appId";}@Overridepublic String getMchID() {return "自己的商户号";}@Overridepublic String getKey() {return "自己的密钥";}@Overridepublic InputStream getCertStream() {ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);return certBis;}@Overridepublic int getHttpConnectTimeoutMs() {return 8000;}@Overridepublic int getHttpReadTimeoutMs() {return 10000;}/***这里的方法,实现必须如下*/IWXPayDomain getWXPayDomain() {IWXPayDomain iwxPayDomain = new IWXPayDomain() {@Overridepublic void report(String domain, long elapsedTimeMillis, Exception ex) {}@Overridepublic DomainInfo getDomain(WXPayConfig config) {return new IWXPayDomain.DomainInfo("api.mch.weixin.qq.com", true);}};return iwxPayDomain;}
}
  • 编写我们的支付方法(接口)了
public class MyWXPay {private static final String PAY_SUCCESS = "SUCCESS";private static final String PAY_USERPAYING = "USERPAYING";private MyWXPay(){}private static Log log = LogFactory.getLog(MyWXPay.class);/*** 扫码支付* @throws Exception*/public static String scanCodeToPay(String auth_code) throws Exception {MyConfig config = new MyConfig();WXPay wxpay = new WXPay(config);String out_trade_no = DateUtil.getCurrentTime();Map<String, String> map = new HashMap<>(16);map.put("attach", "订单额外描述");map.put("auth_code", auth_code);map.put("body", "付款码支付测试");map.put("device_info", "1000");map.put("nonce_str", WXPayUtil.generateNonceStr());map.put("out_trade_no", out_trade_no);map.put("spbill_create_ip", "14.17.22.52");map.put("total_fee", "2");//生成签名String sign = WXPayUtil.generateSignature(map, config.getKey());map.put("sign", sign);String mapToXml = null;try {//调用微信的扫码支付接口Map<String, String> resp = wxpay.microPay(map);mapToXml = WXPayUtil.mapToXml(resp);} catch (Exception e) {e.printStackTrace();log.error("微信支付失败"+ e);}//判断支付是否成功String return_code = null;String result_code = null;String err_code_des = null;String err_code = null;//获取Document对象(主要是获取支付接口的返回信息)Document doc = DocumentHelper.parseText(mapToXml);//获取对象的根节点<xml>Element rootElement = doc.getRootElement();//获取对象的子节点List<Element> elements = rootElement.elements();for (Element element : elements) {if(element.getName().equals("return_code")){return_code = element.getTextTrim();} else if(element.getName().equals("result_code")){result_code = element.getTextTrim();} else if(element.getName().equals("err_code_des")){err_code_des = element.getTextTrim();} else if(element.getName().equals("err_code")){err_code = element.getTextTrim();}}if(PAY_SUCCESS.equals(return_code) && PAY_SUCCESS.equals(result_code)){log.info("微信免密支付成功!");return PAY_SUCCESS;} else if (PAY_USERPAYING.equals(err_code)){for(int i = 0; i < 4; i++){Thread.sleep(3000);Map<String, String> data = new HashMap<>(16);data.put("out_trade_no", out_trade_no);//调用微信的查询接口Map<String, String> orderQuery = wxpay.orderQuery(data);String orderResp = WXPayUtil.mapToXml(orderQuery);String trade_state = null;//获取Document对象Document orderDoc = DocumentHelper.parseText(orderResp);//获取对象的根节点<xml>Element rootElement1 = orderDoc.getRootElement();//获取对象的子节点List<Element> elements1 = rootElement1.elements();for (Element element : elements1) {if(element.getName().equals("trade_state")){trade_state = element.getTextTrim();}}if(PAY_SUCCESS.equals(trade_state)){log.info("微信加密支付成功!");return PAY_SUCCESS;}log.info("正在支付" + orderResp);}}log.error("微信支付失败!");return err_code_des;}
}

我这里模拟了付款时需要输入密码,进行了三次轮询。里面的各个参数的含义,我这里就不详细写了,请参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1

  • 最后一步就是进行测试
@Testpublic void test4(){try {String result = MyWXPay.scanCodeToPay("请填写测试微信二维码信息");System.out.println(result);} catch (Exception e) {e.printStackTrace();}}
  • 工具类代码
public class DateUtil {private DateUtil(){throw new RuntimeException("不能被实列化!");}/*** 获取当前时间(14位)* @return*/public static String getCurrentTime(){Date now = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");return simpleDateFormat.format(now);}/*** 获取当前时间戳,单位秒(10位)* @return*/public static long getCurrentTimestamp() {return System.currentTimeMillis()/1000;}/*** 获取当前时间戳,单位毫秒(13位)* @return*/public static long getCurrentTimestampMs() {return System.currentTimeMillis();}}

今天的分享就是这些了,希望能给你有所帮助,写的不好还请大家见谅。在下一篇博客里我想给大家介绍第二种支付方式JSAPI支付 ,希望得到大家的支持。谢谢大家!祝大家生活愉快,合家欢乐。

java开发微信付款码支付相关推荐

  1. 微信支付开发(6)--付款码支付(被扫)开发详解

    点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 场景 2. 开发说明 3. 普通商户付款码支付 3.1 项目构建 3.2 编写配置类 3.3 编写网页 ...

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

    这篇文章主要给大家结合微信支付接口开发的实践,从获取用户授权到各主要接口的使用方法等方面介绍微信支付的关键点技术,有需要的小伙伴可以参考下 最近做了微信公众号支付的开发,由于是第一次做也摸索了几天的时 ...

  3. Vue前端开发——微信扫码支付

    1.安装 qrcodejs2 (注意:安装的是qrcodejs2,不要安装qrcode ---> 会报错) npm install qrcodejs2 --save 2.Course.vue中页 ...

  4. 网站微信扫码支付java开发

    网站微信扫码支付java开发 一.网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得 二.首先去微信公众平台申请账户 https://mp.weixin.qq.com ** 三 ...

  5. 企业实战, java、spingboot微信扫码支付,页面生成微信二维码,微信扫码付款,websocket通知,处理订单!复制粘贴代码直接开干

    一  功能描述:    前端选择商品后生成二维码,用户微信扫码支付 备注: 红色为后台给前端的接口 1.前端 选择确认商品 2.调后台生成订单接口 (状态未付款) 3.返回订单的详情(订单确认页面  ...

  6. JAVA微信扫码支付及微信App支付开发(模式二)完整功能实现

    一,准备工作 事前申请一个商家版的微信公众号(目前微信支付只有商家版公众号可开通),然后开通微信支付功能,并做相应的配置. 申请开通微信公众号和开通微信支付需要等待审核,一般都5个工作日左右.开通成功 ...

  7. 微信 扫码支付模式二 开发

    概要 主要记录自己的开发流程,使用的springMVC 支付流程 引入相关依赖 <!-- 微信支付 --> <dependency><groupId>com.git ...

  8. JAVA微信扫码支付模式二功能实现完整例子

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

  9. JAVA开发微信支付(JSAPI支付)

    最近开发完了微信支付功能模块,下面就趁热打铁整理下微信支付(JSAPI支付)相关的知识. 1.JSAPI支付 JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSA ...

  10. Java微信扫码支付

    Java微信扫码支付 以下内容是基于模式二开发 在开发之前需要先到微信支付官网注册账号,并获取到以下信息 appid:wx1137939101111111公众账号id mch_id:143811111 ...

最新文章

  1. SAP LSMW 物料主数据导入毛重净重放大1000倍问题之对策
  2. ACCESS MDB数据库记录误删除恢复
  3. php dirtoarray,PHP Ds\Stack toArray()用法及代码示例
  4. php中符号 的作用是什么意思,PHP中@符号的用途是什么?
  5. 基于Smadja算法的搭配词自动提取实践
  6. ImageNet又被Long-Short Transformer 霸榜!
  7. 自考计算机软件基础真题,2019年4月自考计算机软件基础考试真题试卷
  8. 从零开始学人工智能--统计学习:统计学习基础知识
  9. 强制卸载mysql关联程序
  10. python pygame实战1: 小球碰撞balls collision
  11. 树莓派基于QT实现利用USB转485模块进行串口通讯
  12. Review of 2012 Goal for 2013
  13. 技术胖Web前端视频教程合集
  14. API工具栏教你如何采集淘宝拼多多商品详情数据
  15. --fiddler--实战--抓包到底干嘛用?
  16. 地图投影之UTM和高斯克里格投影
  17. 广告roi怎么计算公式_ROI是什么意思,怎么计算的?
  18. 基于python的word批量图文排版
  19. Facebook的语音助手Aloha疑曝光
  20. 【医学】【信息工程】心电图分析方法的自学

热门文章

  1. 欢乐鼠标自动点击器_抓住夏天的尾巴|与自动点击评论器邂逅一次
  2. CMake多版本共存
  3. Pycharm 更换皮肤和壁纸
  4. 软件测试自学毛笔字纹身,254439
  5. 【软件下载】常用安装包下载链接
  6. Photoshop脚本 镜头光晕滤镜的使用
  7. mysql 语法大全
  8. linux嗅探密码,tcpdump密码嗅探_tag
  9. Tony Chen的专栏
  10. 微信公众号自定义菜单修改