微信统一支付 jsapi

public class UnifiedOrderRequest {

  @ApiModelProperty(value = "设备号")
  private String deviceInfo;
  @ApiModelProperty(value = "商品描述",required = true)
  private String body;
  @ApiModelProperty(value = "商品详情")
  private String detail;
  @ApiModelProperty(value = "附加数据")
  private String attach;
  @ApiModelProperty(value = "商户订单号",required = true)
  private String outTradeNo;
  @ApiModelProperty(value = "标价币种")
  private String feeType;
  @ApiModelProperty(value = "标价金额/分",required = true)
  private Integer totalFee;
  @ApiModelProperty(value = "终端IP",required = true)
  private String spbillCreateIp;
  @ApiModelProperty(value = "订单优惠标记")
  private String goodsTag;
  @ApiModelProperty(value = "交易类型",required = true)
  private String tradeType;
  @ApiModelProperty(value = "商品ID")
  private String productId;
  @ApiModelProperty(value = "指定支付方式")
  private String limitPay;
  @ApiModelProperty(value = "用户标识")
  private String openid;
  @ApiModelProperty(value = "电子发票入口开放标识")
  private String receipt;
  @ApiModelProperty(value = "场景信息")
  private String sceneInfo;

  private String appName;
  private Integer userId;

}
 public String unifiedOrders(UnifiedOrderRequest unifiedOrderRequest) {

    String appId ="";//需要填写
    String mchId = "";//需要填写
    String appKey = "";//用来做加密的
    String nonceStr = generateBillNoService.generateRandomString(12);//随机字符串
    String notifyUrl = "";//支付结果回调地址
    SortedMap<String, Object> sortedMap = new TreeMap<>();

    sortedMap.put("appid", appId);
    sortedMap.put("mch_id", mchId);
    sortedMap.put("nonce_str", nonceStr);
    sortedMap.put("body", unifiedOrderRequest.getBody());
    sortedMap.put("out_trade_no", unifiedOrderRequest.getOutTradeNo());
    sortedMap.put("total_fee", unifiedOrderRequest.getTotalFee().toString());
    sortedMap.put("spbill_create_ip", unifiedOrderRequest.getSpbillCreateIp());
    sortedMap.put("notify_url", notifyUrl);
    sortedMap.put("trade_type", unifiedOrderRequest.getTradeType());
    sortedMap.put("openid", unifiedOrderRequest.getOpenid());
    String sign = weiXinProxy.createSign("utf-8", sortedMap, appKey);//做签名
    sortedMap.put("sign", sign);

    Map<String, String> payResultMap = weiXinProxy.unifiedOrder(sortedMap);
   //进行校验
    if (weiXinProxy.checkResultInfo(payResultMap, appKey).getCode() != 0) {
      return weiXinProxy.checkResultInfo(payResultMap, appKey).getMessage();
    }

    return payResultMap.get("prepay_id");
  } 

 给相关数据做签名

public String createSign(String characterEncoding, SortedMap<String, Object> parameters, String apiKey) {
    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=" + apiKey);
    String sign = MD5Encode(sb.toString(), characterEncoding).toUpperCase();
    return sign;
  }

  MD5加密

public static String MD5Encode(String origin, String charsetname) {
    String resultString = null;
    try {
      resultString = new String(origin);
      MessageDigest md = MessageDigest.getInstance("MD5");
      if (charsetname == null || "".equals(charsetname))
        resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
      else
        resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
    } catch (Exception exception) {
    }
    return resultString;
  }

  支付结果校验

public DefaultResponse checkResultInfo(Map<String, String> payResultMap, String secrectkey) {
    SortedMap<String, Object> resultMap = new TreeMap<>();
    for (String key : payResultMap.keySet()) {
      if (key.equals("sign")) {
        continue;
      } else {
        resultMap.put(key, payResultMap.get(key));
      }
    }
    DefaultResponse response = new DefaultResponse(0, "SUCCESS");

    if (payResultMap.get("return_code") == null || !payResultMap.get("return_code").equals("SUCCESS")) {
      response.setCode(10001);
      response.setMessage(payResultMap.get("return_msg"));
    } else if (payResultMap.get("result_code") == null || !payResultMap.get("result_code").equals("SUCCESS")) {
      response.setCode(10001);
      response.setMessage(payResultMap.get("err_code_des"));
    } else if (payResultMap.get("sign") == null || !payResultMap.get("sign").equals(createSign("utf-8", resultMap, secrectkey))) {
      response.setCode(10001);
      response.setMessage("支付失败_数据错误");
    }
    log.info(response);
    return response;
  }

  调用微信接口

public Map<String, String> unifiedOrder(@RequestBody SortedMap<String, Object> request) {
    RestTemplate restTemplate = new RestTemplate();
    String requestUri = Constant.WX_PAY_URL;
    Map<String, String> map = new HashMap<>();
    try {
      map = doXMLParse(new String(restTemplate.postForObject(requestUri, getRequestXml(request), String.class).getBytes("ISO-8859-1"), "UTF-8"));//防止中文乱码
    } catch (Exception e) {
      log.info(e.getMessage());
    }
    return map;
  }

  生成xml

public String getRequestXml(SortedMap<String, Object> parameters) {
  StringBuffer sb = new StringBuffer();
  sb.append("<xml>");
  Set es = parameters.entrySet();
  Iterator it = es.iterator();
  while (it.hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    String key = (String) entry.getKey();
    String value = (String) entry.getValue();
    if ("attach".equalsIgnoreCase(key) || "body".equalsIgnoreCase(key) || "sign".equalsIgnoreCase(key)) {
      sb.append("<" + key + ">" + "<![CDATA[" + value + "]]></" + key + ">");
    } else {
      sb.append("<" + key + ">" + value + "</" + key + ">");
    }
  }
  sb.append("</xml>");
  try {
    return new String(sb.toString().getBytes(), "ISO8859-1");
  } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    return null;
  }
}
解析返回的xml
 public Map<String, String> doXMLParse(String strxml) throws Exception {
    strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");

    if (null == strxml || "".equals(strxml)) {
      return null;
    }
    Map<String, String> map = new HashMap();

    InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(in);
    Element root = doc.getRootElement();
    List list = root.getChildren();
    Iterator it = list.iterator();
    while (it.hasNext()) {
      Element e = (Element) it.next();
      String k = e.getName();
      String v = "";
      List children = e.getChildren();
      if (children.isEmpty()) {
        v = e.getTextNormalize();
      } else {
        v = getChildrenText(children);
      }
      map.put(k, v);
    }
    //关闭流
    in.close();
    return map;
  }

支付结果回调接口

public String callBackWeiXinPay(String xml) {
    log.info(xml);
    Map<String, String> map = new HashMap<>();
    try {
      if (xml == null)
        return "FAIL";
      map = weiXinProxy.doXMLParse(xml);
      //有订单号 代表成功
      if (map.get("out_trade_no") != null) {

        String appKey = "";
        //签名验证
        DefaultResponse defaultResponse = weiXinProxy.checkResultInfo(map, appKey);
        //验证回调结果 (订单金额和返回的金额是否相等)写功能
      }
    //通知微信
      return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
    } catch (Exception e) {
      e.printStackTrace();
      return "FAIL";
    }
  }

原文地址:https://www.cnblogs.com/water-dream/p/10812020.html

时间: 2024-11-01 12:00:45

微信统一支付 jsapi的相关文章

微信原生支付 Native扫码支付( V3.3.7 版本)

[尊重别人的劳动成果,转载请注明出处:一缕晨光工作室,www.wispdawn.com] 前言 辛苦研究三天,遇到各种困难,最终还是克服了,把我的理解和思路分享给需要帮助的人,如果你觉的好,请帮我分享一下,谢谢. 在没有做之前,我以为和支付宝,以及银联一样,会在官网找到相应的demo,照葫芦画瓢即可,没有什么复杂的,真正去做的时候,发现各种错误,很多时候都莫名其妙找不到北, 在网上搜了不知道多少遍,有V3版的,不过都是js api版本的,没有找到原生扫码支付,下了几个V2版本的微信支付c#dem

微信公众号JSAPI支付

微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心->网页服务->网页授权获取用户基本信息->修改; “授权回调页面域名修改成你的域名地址即可,须保证网页授权已获得,不然会报redirect_uri 参数错误; 三:网页授权获取用户openid js_api_call.php 请求文件中改动(所有传给微信的参数都在入口文件中接收) $out_tr

微信公众号JSAPI网页支付

一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:用户打开图文消息戒者扫描二维码,在微信内置浏览器打开网页进行的支付.商户网页前端通过使用微信提供的 JS API,调用微信支付模块.这种方式,适合需要在商户网页进行选购下单的购买流程. 二.准备工作 公共号支付需要提前在微信公共平台进行业务配置,包括设置支付授权目录.设置JS接口安全域名以及设置授权回调页面域名. 1.进行微信公众支付之前,我们需要申请个公

PHP微信公众号JSAPI网页支付(下)

上一篇<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/hld123/p/6626323.html">PHP微信公众号JSAPI网页支付(上)</a>中讲到了公众号平台的相关设置以及支付的大致流程. 这一篇重点讲支付后,异步接受回调通知,以及处理后同步通知微信服务器. 首先梳理下整个jsapi支付的流程 1.网页授权获取用户o

微信支付JsAPI

https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip 下载获取微信支付demo压缩包 打开压缩包,并将其中 WxpayAPI_php_v3\example下的 jsapi.php log.php WxPay.JsApiPay.php WxPay.MicroPay.php WxPay.NativePay.php 解压缩到根目录 tellingtent/ 打开 WxPay.JsApiPay.php WxPay.Micr

微信支付-JSAPI支付V3-发起一次支付请求

JSAPI支付业务流程:图片来源于:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_4 准备工作:需要先在项目中引用Senparc.WeiXin.dll和Senparc.WeiXin.MP.dll,开源项目见:https://github.com/JeffreySu/WeiXinMPSDK 第一步:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 第二步:引入JS文件 在需要调用JS接口的

微信公众号jsapi支付php源码分析

微信公众号支付,首先需要通过授权跳转地址里获取code,并进一步向微信获取openid,然后拉起统一支付获取prepay_id,然后再等待用户按下支付,调起支付.支付部分在前端,很多初次使用微信公众号支付的人人对获取code和opendi部分不懂,微信的php,java等demo源代码地址如下 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1. 微信支付的演示地址(在微信内复制黏贴后点击打开)http://paysdk.w

转-微信支付(公众号支付JSAPI)

原文路径:https://blog.csdn.net/javaYouCome/article/details/79473743 写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都没摸清,更不要说实现了.本以为网上的微信开发教程会和"java的重写与重载"一样铺天盖地,可搜出来的结果,要么是PHP的教程(微信支付官网推荐就是PHP),要么星星点点就那么几篇,想对比的看看思路都成问题,官网

[微信开发] - 微信支付 JSAPI 形式

微信官方的JSAPI文档 微信官方的JSAPI支付SDK与DEMO下载 查看JSAPI的API可以从这里看 下载了支付DEMO其实有些地方不对的,比如如果做沙盒测试的时候,需要使用getsignkey,而官方的demo中没有这个. 看了看sf.gg的一个文章,之后把获取getsignkey的api请求加了进去. 现在的 WXPayConstants : package com.wechat.demo.wxpay; import org.apache.http.client.HttpClient;