最近在做微信支付,微信支付比较坑,官方居然只有.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;}}}

转载于:https://www.cnblogs.com/root429/p/9251332.html

微信支付(PC扫码支付和H5公众号支付)相关推荐

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

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

  2. 微信支付----PC扫码支付(查询微信支付订单判断是否支付成功)

    提示------------------几个状态没有加判断--------如:微信返回订单号不存在,微信系统异常....c#webapi建议前端轮番查询订单状态#region 查询扫码订单状态/// ...

  3. C#招行支付流程(一网通支付-PC扫码支付)

    一.支付流程 1.平台自己生成的二维码(地址链接的二维码,扫码跳转) 2.编写静态页面,测试app扫描平台自己生成的二维码(地址链接二维码,app扫码后手机上展示静态页面进行支付操作) 3.点击立即支 ...

  4. vue h5 公众号支付

    由于微信浏览器的限制无法从微信浏览器调起微信支付,需要对接公众号的支付 后端的小伙伴需要做一些微信公众号的配置(商户目录 .域名) 以及 微信商户平台的配置 前端主要的是通过 code 获取 open ...

  5. uniapp h5 公众号 支付

    接入前准备 下面封装好的方法 将接口返回的参数替换掉就可以了 function onBridgeReady(url, data, callback) {uni.request({url: api[ur ...

  6. android源码大全 IOS游戏源代码打包下载 小游戏|视频教程 微信小程序源码带后台全套|公众号平台

    不断更新中,下面是2017-12-22更新部分 IOS_源码及视频一小部分: 开发环境:Xcode 基于cocos2d的tweejump跳跃游戏ios经典游戏源码.rar  https://pan.b ...

  7. 微信H5公众号支付问题-(get_brand_wcpay_request:fail)2017年10月

    微信支付文档确实做的有很多不足的地方,基于以上情况本人对于微信支付遇到get_brand_wcpay_request:fail做出如下解决方案: function jsApiCall() {Weixi ...

  8. 微信支付教程系列之公众号支付

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...

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

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

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

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

最新文章

  1. 360金融翟政:科技成就金融场景零容错
  2. 机房合作--驼峰命名法
  3. 更改putty字体颜色
  4. 谈谈AOP应用层切面设计
  5. 据调查95%以上的AI从业者不具备修改模型或者提出新模型的技术能力
  6. Tomcat中容器的pipeline机制
  7. 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
  8. iOS 去除警告 看我就够了
  9. Python学习笔记之字典(三)
  10. 解决Redis修改bind域名绑定后出现Could not connect to Redis
  11. Jmeter启动报错解决方案
  12. UEFI boot: how does that actually work, then?
  13. kubectl mysql 集群_mysql-kubernetes
  14. linux中搭建java开发环境
  15. 从对工作流理论发展的理解到jBPM4的设计思想
  16. 17.go 面向对象 interface
  17. Web前端期末大作业--响应式美女健身教练瑜伽馆网页设计(HTML+CSS+JavaScript+)实现
  18. 单片机c语言延时1ms函数,单片机c语言延时函数用int与char有延时差吗?
  19. GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
  20. bzoj 1921: [Ctsc2010]珠宝商

热门文章

  1. 软件测试简历上的职业技能怎么写,软件测试岗位个人简历个人技能范文
  2. 基于Python+Django的电影推荐系统毕业设计源码
  3. 【笔记】《离散数学》第十章 递推方程与生成函数
  4. 软件项目需求开发过程实践之软件需求说明书
  5. visio2016 数据库模型图_数据库第七章--NoSQL数据库
  6. TideSec远控免杀学习四(BackDoor-Factory+Avet+TheFatRat)
  7. EeasyWechat 微信app支付
  8. 斐讯K3路由器TTL快速刷机
  9. 35张动图:关于机房空调水冷系统和风冷系统
  10. Java 程序员必须掌握的 4 大开源框架!