SpringBoot2.0ウィジェット支払い機能weixin-java-payを実現

17051 ワード

SpringBoot2.0ウィジェット支払い機能weixin-java-payを実現
WxJava-微信開発Java SDK(開発キット);微信支払い、オープンプラットフォーム、公衆番号、企業微信/企業番号、小プログラムなどの微信機能を含むバックエンド開発をサポートする.
ステップ1:SDKの使い方
Maven方式導入:
<dependency>
  <groupId>com.github.binarywanggroupId>
  <artifactId>( )artifactId>
  <version>3.3.0version>
dependency>

各モジュールのartifactId:
  • マイクロメッセージウィジェット:weixin-java-miniapp
  • 微信支払:weixin-java-pay
  • 微信オープンプラットフォーム:weixin-java-open
  • 公衆番号(購読番号とサービス番号を含む):weixin-java-mp
  • 企業番号/企業微信:weixin-java-cp
  • ステップ2:微信関連情報の構成
    application.yml
    #       
    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 #  

    ステップ3:統合受注インタフェースビジネスの作成
    統一注文支払いインタフェースを呼び出す:wxServices.createOrder(orderRequest)
    /**
     * @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 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 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());
          }
        }

    }

    ステップ4:ウィジェット側で操作可能
    ウィジェット側は主にウィジェットインタフェースを呼び出してユーザー情報を取得し、主にcodeであり、それからバックグラウンドに伝え、バックグラウンドはcodeを通じてopenid取得方式を取得する.
    WxMaService  wxService = WxMaConfiguration.getMaService(appid);
                WxMaJscode2SessionResult wx_session = wxService.getUserService().getSessionInfo(code);
                openId = wx_session.getOpenid();
                log.info(" openId==>{}", openId);

    その後,コールバックアドレスから返されたデータに基づいて,ウィジェットはデータを解析的にカプセル化して支払いインタフェースを呼び出して支払いを行うことができる.
    ここで主に述べるバックエンドの使い方
    ==================================================================
    ブログアドレス:https://www.codepeople.cn
    ==================================================================
     
    転載先:https://www.cnblogs.com/lr393993507/p/10718136.html