SpringBoot2.0小程序支付功能實現weixin-java-pay

SpringBoot2.0小程序支付功能實現weixin-java-pay

WxJava - 微信開發 Java SDK(開發工具包); 支持包括微信支付、開放平臺、公衆號、企業微信/企業號、小程序等微信功能的後端開發。java

第一步: SDK使用方式

Maven方式引入:git

<dependency>
  <groupId>com.github.binarywang</groupId>
  <artifactId>(不一樣模塊參考下文)</artifactId>
  <version>3.3.0</version>
</dependency>

各模塊的artifactId:github

  • 微信小程序:weixin-java-miniapp
  • 微信支付:weixin-java-pay
  • 微信開放平臺:weixin-java-open
  • 公衆號(包括訂閱號和服務號):weixin-java-mp
  • 企業號/企業微信:weixin-java-cp

第二步:配置微信相關信息

application.ymlweb

#微信小程序配置
wx:
  miniapp:
    configs:
        - appid: #微信公衆號或者小程序等的appid 必填
          secret: #微信公衆號或者小程序等的secret 必填
          token: #微信小程序消息服務器配置的token
          aesKey: #微信小程序消息服務器配置的EncodingAESKey
          msgDataFormat: JSON
  pay:
    appId:  #微信公衆號或者小程序等的appid 必填
    mchId:  #微信支付商戶號    必填
    mchKey: #微信支付商戶密鑰
    subAppId: #服務商模式下的子商戶公衆帳號ID
    subMchId: #服務商模式下的子商戶號
    keyPath: classpath:cert/apiclient_cert.p12 # p12證書的位置,能夠指定絕對路徑,也能夠指定類路徑(以classpath:開頭)
  notifyUrl: https://www.xxx.com/wx/notify #微信支付回調地址 本身定義可是必須放到外網微信能夠訪問的到

第三步:編寫統一訂單接口業務

調用統一下單支付接口:wxService.createOrder(orderRequest)spring

/**
 * @Title: WxUserVedioController.java
 * @Package io.renren.modules.wx.controller
 * @Description: 
 * Copyright: Copyright (c) 2019 www.codepeople.cn Inc. All rights reserved. 
 * Website: www.codepeople.cn
 * 注意:本內容僅限於海南科瀾技術信息有限公司內部傳閱,禁止外泄以及用於其餘的商業目 
 * @Author 劉仁
 * @DateTime 2019年4月6日 上午11:54:08
 * @version V1.0
 */

package io.renren.modules.wx.controller;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;

import io.renren.common.utils.DateUtils;
import io.renren.common.utils.IPUtils;
import io.renren.common.utils.PageUtils;
import io.renren.common.utils.R;
import io.renren.modules.soft.entity.AuthorizationEntity;
import io.renren.modules.soft.entity.HospitalEntity;
import io.renren.modules.soft.entity.OrderEntity;
import io.renren.modules.soft.entity.PayFlowEntity;
import io.renren.modules.soft.entity.PurchaseRecordEntity;
import io.renren.modules.soft.entity.RefundRecordEntity;
import io.renren.modules.soft.service.AuthorizationService;
import io.renren.modules.soft.service.BedBaseService;
import io.renren.modules.soft.service.DeviceService;
import io.renren.modules.soft.service.HospitalService;
import io.renren.modules.soft.service.OrderService;
import io.renren.modules.soft.service.PayFlowService;
import io.renren.modules.soft.service.PurchaseRecordService;
import io.renren.modules.soft.service.RefundRecordService;
import io.renren.modules.soft.service.StatementService;
import io.renren.modules.soft.service.ThirdUserService;
import io.renren.modules.soft.service.UserAuthorizationService;
import io.renren.modules.soft.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

/**
 * @ClassName: WxUserVedioController
 * @Description: 
 * @Author 劉仁
 * @DateTime 2019年4月6日 上午11:54:08 
 */
@Api(tags = "普通用戶操做接口")
@RestController
@RequestMapping("/wx")
@Slf4j
public class WxxxxUserVedioController {
    @Value("${wx.notifyUrl}")
    private String notifyUrl;
    @Autowired
    private WxPayService wxService;
    @Autowired
    private HospitalService hospitalService;
    @Autowired
    private PayFlowService payFlowService;
    @Autowired
    private OrderService orderService;

    /**
     * @Title: createOrder
     * @Description: 
     * @Author 劉仁
     * @DateTime 2019年4月6日 下午12:12:11
     * @param
     * @return
     */
    @PostMapping("/user/createOrder")
    public R createOrder(HttpServletRequest request,@RequestBody Map<String,String> map)  throws WxPayException{
        String bed_id = map.get("bedId");
        log.info("參數的bed_id:{}", bed_id);
        if (StringUtils.isAnyBlank(bed_id)) {
            return R.error("參數不能爲null");
        }
        Long bedId = Long.valueOf(bed_id).longValue();
        //根據bedId 查找所屬醫院的價格
        HospitalEntity hospitalEntity = hospitalService.hospitalByBedId(bed_id.trim());
        BigDecimal money = hospitalEntity.getCharge();

        HttpSession session = request.getSession();
        String mobile = (String) session.getAttribute("userphone");
        String userId = (String) session.getAttribute("userId");
        // TODO 插入訂單記錄
        // TODO 記錄用戶的購買記錄
        // TODO 調用統一輩子成訂單接口
        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
        orderRequest.setSignType(WxPayConstants.SignType.MD5);
        orderRequest.setBody("丹弗兒科技");
        orderRequest.setOutTradeNo(order_No); //本身生成order_No
        orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI);
//        orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(yuanMoney));//直接分
        orderRequest.setTotalFee(money.intValue());//直接分
        orderRequest.setOpenid(userEntity.getOpenid()); // 獲取微信支付用戶的openId
        orderRequest.setSpbillCreateIp(IPUtils.getIpAddr(request));
        Date now = new Date();
        Date afterDate = DateUtils.addDateMinutes(now, 10);//10分鐘後
        orderRequest.setTimeStart(DateUtils.format(now, "yyyyMMddHHmmss"));
        orderRequest.setTimeExpire(DateUtils.format(afterDate, "yyyyMMddHHmmss"));
        orderRequest.setNotifyUrl(notifyUrl);
        Object order = wxService.createOrder(orderRequest);

        return R.ok().put("order", order);
    }

    @ApiOperation("微信支付回調地址")
    @ResponseBody
    @PostMapping("/notify")
    public String payNotify(HttpServletRequest request, HttpServletResponse response) {
      try {
        /*HttpSession session = request.getSession();
        String mobile = (String) session.getAttribute("userphone");
        if (StringUtils.isBlank(mobile)) {
            return R.error(401, "session獲取不到受權手機號!");
        }
          //獲取用戶手機號,根據用戶手機號獲取用戶ID
          AuthorizationEntity user = authorizationService.getOneByMobile(mobile);*/
        String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
        WxPayOrderNotifyResult notifyResult = wxService.parseOrderNotifyResult(xmlResult);
        // 結果正確 outTradeNo
        String orderId = notifyResult.getOutTradeNo();
        String tradeNo = notifyResult.getTransactionId();
        String totalFee = BaseWxPayResult.fenToYuan(notifyResult.getTotalFee());
        if("SUCCESS".equals(notifyResult.getResultCode())) {
            PayFlowEntity entity = new PayFlowEntity();
            entity.setPayFee(BigDecimal.valueOf(notifyResult.getCashFee()));
            entity.setPayFlowNo(orderId);
            entity.setPayUserInfo(notifyResult.getOpenid());
            entity.setThreeInNo(tradeNo);
            payFlowService.save(entity);
            OrderEntity order_entity = new OrderEntity();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            order_entity.setCreateTime(new Date());
            //更新訂單信息
            UpdateWrapper<OrderEntity> updateWrapper = new UpdateWrapper<>();
            updateWrapper.set("order_status", "1");
            updateWrapper.set("pay_id", notifyResult.getOpenid());
            updateWrapper.set("pay_status", "1");
            updateWrapper.set("pay_end_time", sdf.parse(notifyResult.getTimeEnd()));
            updateWrapper.eq("order_no",notifyResult.getOutTradeNo());
            orderService.update(updateWrapper);
        }
        //本身處理訂單的業務邏輯,須要判斷訂單是否已經支付過,不然可能會重複調用
         return WxPayNotifyResponse.success("成功");
      } catch (Exception e) {
        log.error("微信回調結果異常,異常緣由{}", e.getMessage());
       // WxPayNotifyResponse.fail(e.getMessage());

        return WxPayNotifyResponse.success("code:"+9999+"微信回調結果異常,異常緣由:"+e.getMessage());
      }
    }

}

第四步:小程序端能夠操做了

小程序端主要先調用小程序接口獲取用戶信息主要是code,而後傳給後臺,後臺經過code獲取openid獲取方式:apache

WxMaService  wxService = WxMaConfiguration.getMaService(appid);
            WxMaJscode2SessionResult wx_session = wxService.getUserService().getSessionInfo(code);
            openId = wx_session.getOpenid();
            log.info("經過微信獲取用戶的openId==>{}", openId);

而後根據回調地址返回的數據,小程序就能夠對數據進行解析封裝調用支付接口進行付款了。小程序

這裏主要講的後端的使用方法後端

==================================================================微信小程序

博客地址https://www.codepeople.cnapi

==================================================================

相關文章
相關標籤/搜索