最近在做微信支付,微信支付比较坑,官方居然只有.NET、C#、PHP的demo居然没有java的demo。然后微信支付是不提供测试账号的需要直接用正式的公众号。首先来介绍下微信扫码支付吧,微信扫码有两种方式,这里采用第二种方式统一下单(JSAPI)。需要提前在微信公众号后台申请微信支付开通,具体的开通规则详细文档见点击打开链接

其实微信支付挺简单的无非就是拼装参数给微信发送请求,要注意的几点就是支付的金额是分,微信没有同步回调地址,只有异步回调的地址。这样的话就不能实时反馈支付结果到PC端页面。网上大多数同步的做法就是通过ajax定时查询订单的状态,(可以查询自己业务订单的支付状态或者去调微信支付查询接口微信给我们返回的订单状态)两种都可以,lz建议还是去查询微信服务那边的订单查询接口。这样可以缓解我们自己的服务器的压力,也可以预防人家恶意刷我们的接口。京东也是采用定时轮询查询订单的状态的他们是每隔3s去查一次。

下面附上H5和PC扫码支付的代码这是H5和Pc下单的接口

package com.workit.pay.weixin.wxPay;

import java.util.Date;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.workit.comm.util.String.StringUtil;
import com.workit.pay.weixin.wxPay.constant.WeiXinPayConstant;
import com.workit.pay.weixin.wxPay.util.PayCommonUtil;
import com.workit.pay.weixin.wxPay.util.WeixinFormatXmlProcess; /**
* @Title: WxPayService.java
*.qqwx.wxPay
* @Description: TODO
*
* @date 2017年5月3日 上午11:16:48
* @version V1.0
*/
public class WxPayService {
private static final Logger logger = LoggerFactory.getLogger(WxPayService.class); public static String getOrderNo(){
return "DD"+String.valueOf(new Date().getTime());
} /**
*
* @Title: unifiedOrderPC
* @Description: 微信PC 扫码下单接口
* @param @param body
* @param @param orderNo
* @param @param totalFee
* @param @return
* @param @throws Exception
* @return String
*/
public static String unifiedOrderPC(String body,String orderNo, String totalFee) throws Exception{
return unifiedOrder(body,orderNo, totalFee,null,WeiXinPayConstant.TRADE_TYPE_PC,null);
} /**
*
* @Title: unifiedOrderH5
* @Description: 微信H5 下单接口
* @param @param body 商品描述
* @param @param orderNo
* @param @param totalFee
* @param @param openId
* @param @param ip
* @param @return
* @param @throws Exception
* @return SortedMap<Object,Object>
*/
public static SortedMap<Object, Object> unifiedOrderH5(String body,String orderNo, String totalFee,String openId,String ip) throws Exception{
String prepay_id = unifiedOrder(body,orderNo, totalFee,openId,WeiXinPayConstant.TRADE_TYPE_H5,ip);
if(StringUtil.isNotEmpty(prepay_id)){
SortedMap<Object, Object> payMap = new TreeMap<Object, Object>();
payMap.put("appId",WeiXinPayConstant.APPID);
payMap.put("timeStamp",PayCommonUtil.createTimestamp());
payMap.put("nonceStr",PayCommonUtil.CreateNoncestr());
payMap.put("signType","MD5");
payMap.put("package", "prepay_id="+prepay_id);
String paySign = PayCommonUtil.createSign("UTF-8",payMap,WeiXinPayConstant.API_KEY);
payMap.put("paySign", paySign);
payMap.put("pg", prepay_id);
return payMap;
}else{
return null;
} }
/**
*
* @Title: unifiedOrder
* @Description: 微信支付扫码和H5支付统一下单接口
* @param @param body 商品描述
* @param @param orderNo 订单编号
* @param @param totalFee 总金额单位分
* @param @param openId H5必传的参数
* @param @param payType 支付终端
* @param @param ip 请求IP
* @param @return
* @param @throws Exception
* @return String
*/
public static String unifiedOrder(String body,String orderNo, String totalFee,String openId,String payType,String ip) throws Exception{
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
String tradeType = "";
String spbill_create_ip = "";
if(WeiXinPayConstant.TRADE_TYPE_H5.equals(payType)){//H5支付
tradeType = WeiXinPayConstant.TRADE_TYPE_H5;
spbill_create_ip = ip;
parameters.put("openid", openId);//用户标识 openid 否 String(128) oUpF8uMuAJO_M2pxb1Q9zNjWeS6o trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换
}else{
spbill_create_ip = "10.20.20.64";
tradeType = WeiXinPayConstant.TRADE_TYPE_PC;//PC扫码支付
parameters.put("product_id",orderNo);
}
parameters.put("appid", WeiXinPayConstant.APPID);//公众账号ID appid 是 String(32) wxd678efh567hg6787 微信支付分配的公众账号ID(企业号corpid即为此appId)
parameters.put("body", body);//商品描述 body 是 String(128) 腾讯充值中心-QQ会员充值 商品简单描述,该字段请按照规范传递,具体请见参数规定
parameters.put("mch_id", WeiXinPayConstant.MCH_ID);//商户号 mch_id 是 String(32) 1230000109 微信支付分配的商户号
parameters.put("nonce_str",PayCommonUtil.CreateNoncestr());//随机字符串 nonce_str 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,长度要求在32位以内。推荐随机数生成算法
parameters.put("out_trade_no",orderNo);//商户订单号 out_trade_no 是 String(32) 20150806125346 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。详见商户订单号
parameters.put("spbill_create_ip",spbill_create_ip);//终端IP spbill_create_ip 是 String(16) 123.12.12.123 APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
parameters.put("total_fee", totalFee);//标价金额 total_fee 是 Int 88 订单总金额,单位为分,详见支付金额
parameters.put("notify_url",WeiXinPayConstant.NOTIFY_URL);//通知地址 notify_url 是 String(256) http://www.weixin.qq.com/wxpay/pay.php 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
parameters.put("trade_type",tradeType);//交易类型 trade_type 是 String(16) JSAPI 取值如下:JSAPI,NATIVE,APP等,说明详见参数规定
String sign = PayCommonUtil.createSign("UTF-8",parameters,WeiXinPayConstant.API_KEY);//签名 sign 是 String(32) C380BEC2BFD727A4B6845133519F3AD6 通过签名算法计算得出的签名值,详见签名生成算法
parameters.put("sign", sign);
String requestXML = PayCommonUtil.getRequestXml(parameters); //把参数打包转成xml格式
String result =PayCommonUtil.httpsRequest(WeiXinPayConstant.WEIXIN_PAY_URL,"POST",requestXML);//向微信发送统一下单请求
Map<String, Object> mapResult = WeixinFormatXmlProcess.parseXml1(result); //微信响应的结果
String resultCode =(String)mapResult.get("return_code");
logger.info(mapResult.toString());
if(WeiXinPayConstant.WX_PAY_SUCCESS_STATUS.equals(resultCode)){
if(WeiXinPayConstant.TRADE_TYPE_H5.equals(payType)){//H5支付
return (String)mapResult.get("prepay_id");
}else{
return (String)mapResult.get("code_url");
}
}else{
return null;
}
} }

微信支付(PC扫码支付和H5公众号支付)的更多相关文章

  1. 微信支付之扫码、APP、小程序支付接入详解

    做电商平台的小伙伴都知道,支付服务是必不可少的一部分,今天我们开始就说说支付服务的接入及实现.目前在国内,几乎90%中小公司的支付系统都离不开微信支付和支付宝支付.那么大家要思考了,为什么微信支付和支 ...

  2. 集成微信支付的代码。兼容小程序,扫码,app,公众号。h5 支付 ,以及 服务商提现

      /** * 因为微信总是很多个商户号很多和appid.很多个密钥文件,所以全部改成手动传值的方式,就可以支持多商户调用 * * @param appId 商户的appid * @param mch ...

  3. 微信支付之扫码支付、公众号支付、H5支付、小程序支付相关业务流程分析总结

    前言 很久以来,一直想写一篇微信支付有关的总结文档:一方面是总结自己的一些心得,另一方面也可以帮助别人,但是因种种原因未能完全理解透彻微信支付的几大支付方式,今天有幸做一些总结上的文章,也趁此机会,将 ...

  4. h5微信支付在微信内页使用微信公众号支付

    由于app的迭代,原本的微信支付是使用原生写的 然后h5这边做交互,现在需要修改使用h5的微信支付,于是就有了现在的这个例子,微信支付其实对于我们前端来说就是调用接口然后,根据链接进行支付,其中有点坑 ...

  5. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  6. C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付           今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...

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

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

  8. 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付           今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...

  9. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

随机推荐

  1. rest-framework 分页器

    一 简单分页(查看第n页,每页显示n条) from rest_framework.pagination import PageNumberPagination # 一 基本使用:url=url=htt ...

  2. Java 安全之Java Agent

    Java 安全之Java Agent 0x00 前言 在前面发现很多技术都会去采用Java Agent该技术去做实现,比分说RASP和内存马(其中一种方式).包括IDEA的这些破解都是基于Java A ...

  3. Spring Cloud 学习 (七) Spring Cloud Sleuth

    微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位.主要体现在一个请求可能需要调用很 ...

  4. Arcgis100.4 加载天地图不显示--备注一哈

    Arcgis100.4 默认添加了请求referer 值,天地图会拒绝请求,替换为http://map.tianditu.gov.cn/ 可正常显示.(arcgis 降级到100.1也可正常显示) R ...

  5. Promise自定义,看我如何征服你

    自定义代码 这里是我自定义的Promise,如果想看原版,可以跳过最后有符合PromiseA+规范的源码 class 承诺 { constructor(处理器函数) { //1. 处理器函数是在_ne ...

  6. Python_爬虫养殖专业户_00

    为什么学习爬虫? 当你在夜深人静,睡不着觉,想看一些更加睡不着觉的图片/视频时... 这是一句疑似玩笑话, 现实情况是, 每一天, 整个社会都积累了大量的数据, 在数据化的社会中,没有大批量的收集和探 ...

  7. 第6.6节 Python动态执行小结

    一.    Python动态执行支持通过输入数据流或文件传入Python源代码串,进行编译后执行,可以通过这种方式扩展Python程序的功能: 二.    动态执行方法可能导致恶意攻击,因此使用时需要 ...

  8. 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也

    正则表达式的章节到此就结束了,老猿现在觉得对我们这些身具程序猿基因特色的人来说,正则表达式应该是蛮可口的开胃小菜. 在写标题时,本来想写"正则表达式小结",后来想了想,百度了一下, ...

  9. P1654 OSU! 题解

    \(x\) 为该位置有 \(1\) 的期望. 统计两个值 : \(suma\) 和 \(sumb\). \(suma\) 表示连续 \(X\) 个 \(1\) , \(X\) 的平方的期望, \(su ...

  10. 深入分析 Java、Kotlin、Go 的线程和协程

    前言 协程是什么 协程的好处 进程 进程是什么 进程组成 进程特征 线程 线程是什么 线程组成 任务调度 进程与线程的区别 线程的实现模型 一对一模型 多对一模型 多对多模型 线程的"并发& ...