Browse Source

支付宝押金

suochencheng 7 years ago
parent
commit
66debec06a

+ 2 - 0
src/main/java/com/izouma/awesomeadmin/service/UserInfoService.java

@@ -39,5 +39,7 @@ public interface UserInfoService {
     UserInfo loginWechat(String code) throws UserInfoServiceImpl.LoginException;
     UserInfo loginWechat(String code) throws UserInfoServiceImpl.LoginException;
 
 
     boolean updatePassword(UserInfo userInfo);
     boolean updatePassword(UserInfo userInfo);
+
+    void alipaySuccess(String tradeNo, String tradeStatus);
 }
 }
 
 

+ 50 - 4
src/main/java/com/izouma/awesomeadmin/service/impl/UserInfoServiceImpl.java

@@ -2,11 +2,9 @@ package com.izouma.awesomeadmin.service.impl;
 
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.constant.AppConstant;
-import com.izouma.awesomeadmin.dao.DepartInfoMapper;
-import com.izouma.awesomeadmin.dao.SysAppTokenMapper;
-import com.izouma.awesomeadmin.dao.SysRoleMapper;
-import com.izouma.awesomeadmin.dao.UserInfoMapper;
+import com.izouma.awesomeadmin.dao.*;
 import com.izouma.awesomeadmin.dto.Page;
 import com.izouma.awesomeadmin.dto.Page;
+import com.izouma.awesomeadmin.model.AlipayTemp;
 import com.izouma.awesomeadmin.model.UserInfo;
 import com.izouma.awesomeadmin.model.UserInfo;
 import com.izouma.awesomeadmin.service.OSSFileService;
 import com.izouma.awesomeadmin.service.OSSFileService;
 import com.izouma.awesomeadmin.service.UserInfoService;
 import com.izouma.awesomeadmin.service.UserInfoService;
@@ -52,9 +50,13 @@ public class UserInfoServiceImpl implements UserInfoService {
     private DepartInfoMapper departInfoMapper;
     private DepartInfoMapper departInfoMapper;
     @Autowired
     @Autowired
     private SysAppTokenMapper sysAppTokenMapper;
     private SysAppTokenMapper sysAppTokenMapper;
+
     @Autowired
     @Autowired
     private OSSFileService ossFileService;
     private OSSFileService ossFileService;
 
 
+    @Autowired
+    private AlipayTempMapper alipayTempMapper;
+
     @Override
     @Override
     public List<UserInfo> getUserInfoList(UserInfo record) {
     public List<UserInfo> getUserInfoList(UserInfo record) {
 
 
@@ -396,5 +398,49 @@ public class UserInfoServiceImpl implements UserInfoService {
         }
         }
         return path;
         return path;
     }
     }
+
+    /**
+     * <p>支付宝支付成功回调接口。充值</p>
+     *
+     * @param tradeNo
+     * @param tradeStatus
+     */
+    @Override
+    public void alipaySuccess(String tradeNo, String tradeStatus) {
+
+        logger.info("alipaySuccess:支付宝支付成功回调接口 tradeNo:" + tradeNo + ", tradeStatus:" + tradeStatus);
+        try {
+            AlipayTemp alipayTemp = new AlipayTemp();
+            alipayTemp.setOutTradeNo(tradeNo);
+            alipayTemp = alipayTempMapper.queryAlipayTemp(alipayTemp);
+
+            if (alipayTemp != null) {
+
+                if (!AppConstant.Aliapi.TRADE_SUCCESS.equals(alipayTemp.getTradeStatus())) {
+
+                    UserInfo userInfo = this.getUserInfoById(alipayTemp.getOrderId());
+                    int cashPledge = userInfo.getCashPledge();
+                    UserInfo updateUser = new UserInfo();
+                    updateUser.setId(userInfo.getId());
+                    updateUser.setCashPledge(cashPledge + alipayTemp.getTotalAmount().intValue());
+                    if (userInfo.getApproveStep() == 3) {
+                        //如果是交押金状态,更新为完成。
+                        updateUser.setApproveStep(4);
+                    }
+                    this.updateUserInfo(updateUser);
+
+                    alipayTemp.setTradeStatus(tradeStatus);
+
+                    alipayTempMapper.updateByPrimaryKeySelective(alipayTemp);
+                }
+
+            }
+
+        } catch (Exception e) {
+            logger.error("alipaySuccess:支付宝支付成功回调接口异常 tradeNo:" + tradeNo + ", tradeStatus:" + tradeStatus, e);
+        }
+
+    }
+
 }
 }
 
 

+ 84 - 29
src/main/java/com/izouma/awesomeadmin/web/AlipayController.java

@@ -6,6 +6,7 @@ import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.dao.AlipayTempMapper;
 import com.izouma.awesomeadmin.dao.AlipayTempMapper;
 import com.izouma.awesomeadmin.model.AlipayTemp;
 import com.izouma.awesomeadmin.model.AlipayTemp;
 import com.izouma.awesomeadmin.service.MemberCoinService;
 import com.izouma.awesomeadmin.service.MemberCoinService;
+import com.izouma.awesomeadmin.service.UserInfoService;
 import com.izouma.awesomeadmin.service.UserOrderService;
 import com.izouma.awesomeadmin.service.UserOrderService;
 import com.izouma.awesomeadmin.util.AlipayClientFactory;
 import com.izouma.awesomeadmin.util.AlipayClientFactory;
 import com.izouma.awesomeadmin.util.MbappUtil;
 import com.izouma.awesomeadmin.util.MbappUtil;
@@ -45,6 +46,9 @@ public class AlipayController {
     @Autowired
     @Autowired
     private MemberCoinService memberCoinService;
     private MemberCoinService memberCoinService;
 
 
+    @Autowired
+    private UserInfoService userInfoService;
+
 
 
     @Autowired
     @Autowired
     private AlipayTempMapper alipayTempMapper;
     private AlipayTempMapper alipayTempMapper;
@@ -60,7 +64,7 @@ public class AlipayController {
     @ResponseBody
     @ResponseBody
     public void buy(HttpServletRequest request, HttpServletResponse response, @RequestParam(required = true, value = "orderId") String orderId,
     public void buy(HttpServletRequest request, HttpServletResponse response, @RequestParam(required = true, value = "orderId") String orderId,
                     @RequestParam(required = true, value = "coin") double coin, @RequestParam(required = true, value = "point") double point)
                     @RequestParam(required = true, value = "coin") double coin, @RequestParam(required = true, value = "point") double point)
-            throws ServletException, IOException {
+            throws IOException {
 
 
         double cash = userOrderService.calculatedPrice(orderId, coin, point);
         double cash = userOrderService.calculatedPrice(orderId, coin, point);
         if (cash > 0) {
         if (cash > 0) {
@@ -114,7 +118,7 @@ public class AlipayController {
      */
      */
     @RequestMapping(value = "/recharge", method = RequestMethod.GET)
     @RequestMapping(value = "/recharge", method = RequestMethod.GET)
     @ResponseBody
     @ResponseBody
-    public void recharge(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+    public void recharge(HttpServletRequest request, HttpServletResponse response) throws IOException {
 
 
         String money = request.getParameter("money");
         String money = request.getParameter("money");
         String userId = request.getParameter("userId");
         String userId = request.getParameter("userId");
@@ -152,6 +156,45 @@ public class AlipayController {
     }
     }
 
 
 
 
+    @RequestMapping(value = "/cashPledge", method = RequestMethod.GET)
+    @ResponseBody
+    public void cashPledge(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+        String money = request.getParameter("money");
+        String userId = request.getParameter("userId");
+
+        String outTradeNo = MbappUtil.create_out_trade_no();
+
+        Map<String, String> maps = new HashMap<String, String>();
+        maps.put("out_trade_no", outTradeNo);
+        maps.put("total_amount", String.format("%.2f", Double.valueOf(money)));//PC支付需要两位小数
+        maps.put("subject", "店铺押金:" + money + " 元");
+        maps.put("seller_id", PropertiesFileLoader.getProperties("ALIPAY_SELLER"));
+        // 下面两个 参数的 KEY 不要乱写 要和工具类里面对应
+        maps.put("ReturnUrl", MbappUtil.getDomain(request) + "aliapi/cashPledge_return_url");
+        maps.put("NotifyUrl", MbappUtil.getDomain(request) + "aliapi/cashPledgeAsync");
+        try {
+            String form = AlipayClientFactory.PC_Pay(maps);
+            if (!form.equals("err")) {
+
+                AlipayTemp alipayTemp = new AlipayTemp();
+
+                alipayTemp.setOrderId(userId);
+                alipayTemp.setTotalAmount(BigDecimal.valueOf(Double.valueOf(money)));
+                alipayTemp.setTradeStatus(AppConstant.Aliapi.WAIT_BUYER_PAY);
+                alipayTemp.setOutTradeNo(outTradeNo);
+                alipayTemp.setTypeFlag(AppConstant.Aliapi.CASH_PLEDGE);
+                alipayTempMapper.insertSelective(alipayTemp);
+
+                response.setContentType("text/html;charset=utf-8");
+                response.getWriter().write(form);// 直接将完整的表单html输出到页面
+                response.getWriter().flush();
+            }
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+    }
+
     @RequestMapping(value = "/index")
     @RequestMapping(value = "/index")
     public String index(HttpServletRequest request, HttpServletResponse response) {
     public String index(HttpServletRequest request, HttpServletResponse response) {
 
 
@@ -186,6 +229,19 @@ public class AlipayController {
         return "pay/recharge_success.html";
         return "pay/recharge_success.html";
     }
     }
 
 
+    /**
+     * 押金回调页面
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/cashPledge_return_url")
+    public String cashPledge_return_url(HttpServletRequest request, HttpServletResponse response) {
+
+        return "pay/cashPledge_success.html";
+    }
+
 
 
     /**
     /**
      * 异步通知付款状态的Controller
      * 异步通知付款状态的Controller
@@ -198,21 +254,8 @@ public class AlipayController {
     @RequestMapping(value = "/async", method = RequestMethod.POST)
     @RequestMapping(value = "/async", method = RequestMethod.POST)
     public String async(HttpServletRequest request, HttpServletResponse response) {
     public String async(HttpServletRequest request, HttpServletResponse response) {
 
 
-        Map<String, String> params = new HashMap<String, String>();
-        Map requestParams = request.getParameterMap();
-        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
-            String name = (String) iter.next();
-            String[] values = (String[]) requestParams.get(name);
-            String valueStr = "";
-            for (int i = 0; i < values.length; i++) {
-                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
-            }
-            params.put(name, valueStr);
-        }
         String tradeNo = request.getParameter("out_trade_no");
         String tradeNo = request.getParameter("out_trade_no");
         String tradeStatus = request.getParameter("trade_status");
         String tradeStatus = request.getParameter("trade_status");
-        //String notifyId = request.getParameter("notify_id");  
-        //if(AlipayNotify.verify(params)){//验证成功  
         if (tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")) {
         if (tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")) {
             //要写的逻辑。自己按自己的要求写
             //要写的逻辑。自己按自己的要求写
             System.out.println(">>>>>支付订单成功" + tradeNo);
             System.out.println(">>>>>支付订单成功" + tradeNo);
@@ -237,28 +280,40 @@ public class AlipayController {
     @RequestMapping(value = "/rechargeAsync", method = RequestMethod.POST)
     @RequestMapping(value = "/rechargeAsync", method = RequestMethod.POST)
     public String rechargeAsync(HttpServletRequest request, HttpServletResponse response) {
     public String rechargeAsync(HttpServletRequest request, HttpServletResponse response) {
 
 
-        Map<String, String> params = new HashMap<String, String>();
-        Map requestParams = request.getParameterMap();
-        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
-            String name = (String) iter.next();
-            String[] values = (String[]) requestParams.get(name);
-            String valueStr = "";
-            for (int i = 0; i < values.length; i++) {
-                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
-            }
-            params.put(name, valueStr);
-        }
         String tradeNo = request.getParameter("out_trade_no");
         String tradeNo = request.getParameter("out_trade_no");
         String tradeStatus = request.getParameter("trade_status");
         String tradeStatus = request.getParameter("trade_status");
-        //String notifyId = request.getParameter("notify_id");  
-        //if(AlipayNotify.verify(params)){//验证成功  
         if (tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")) {
         if (tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")) {
             //要写的逻辑。自己按自己的要求写
             //要写的逻辑。自己按自己的要求写
             System.out.println(">>>>>充值成功" + tradeNo);
             System.out.println(">>>>>充值成功" + tradeNo);
 
 
             memberCoinService.alipaySuccess(tradeNo, tradeStatus);
             memberCoinService.alipaySuccess(tradeNo, tradeStatus);
-            return "pay/recharge_success.html";
+            return "pay/cashPledge_success.html";
         } else {//验证失败  
         } else {//验证失败  
+            return "pay/cashPledge_fail.html";
+        }
+
+    }
+
+    /**
+     * 押金异步通知付款状态
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @SuppressWarnings("rawtypes")
+    @RequestMapping(value = "/cashPledgeAsync", method = RequestMethod.POST)
+    public String cashPledgeAsync(HttpServletRequest request, HttpServletResponse response) {
+
+        String tradeNo = request.getParameter("out_trade_no");
+        String tradeStatus = request.getParameter("trade_status");
+        if (tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")) {
+            //要写的逻辑。自己按自己的要求写
+            System.out.println(">>>>>缴纳押金成功" + tradeNo);
+
+            userInfoService.alipaySuccess(tradeNo, tradeStatus);
+            return "pay/recharge_success.html";
+        } else {//验证失败
             return "pay/recharge_fail.html";
             return "pay/recharge_fail.html";
         }
         }
 
 

+ 80 - 39
src/main/vue/src/components/RichText.vue

@@ -1,5 +1,6 @@
 <template>
 <template>
-    <textarea id="tiny" v-model="content"></textarea>
+    <div v-if="disabled" v-html="content" class="preview"></div>
+    <textarea v-else v-model="content" ref="editor" @load="load"></textarea>
 </template>
 </template>
 <script>
 <script>
     import axios from 'axios';
     import axios from 'axios';
@@ -32,61 +33,101 @@
 
 
     require('./zh_CN');
     require('./zh_CN');
     export default {
     export default {
-        props: ['value'],
+        props: ['value', 'disabled'],
         created() {
         created() {
             this.content = this.value || ''
             this.content = this.value || ''
         },
         },
         mounted() {
         mounted() {
-            tinymce.init({
-                selector: '#tiny',
-                skin_url: '/static/skins/lightgray',
-                language: 'zh_CN',
-                menubar: false,
-                branding: false,
-                statusbar: false,
-                height: 300,
-                toolbar: 'undo redo | styleselect bold italic strikethrough forecolor backcolor  | image media link blockquote visualblocks insert | formatselect | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | preview fullscreen code help',
-                plugins: [
-                    'advlist autolink lists link image charmap print preview anchor textcolor',
-                    'searchreplace visualblocks code fullscreen',
-                    'insertdatetime media table contextmenu paste code help imagetools'
-                ],
-                images_upload_url: this.$baseUrl + '/assets/uploadFile',
-                images_upload_handler: function (blobInfo, success, failure) {
-                    let formData = new FormData();
-                    formData.append('file', blobInfo.blob(), blobInfo.filename());
-                    axios.post('/assets/uploadFile', formData).then(res => {
-                        if (res.status === 200) {
-                            if (res.data.success) {
-                                success(res.data.data[0]);
-                                return;
-                            }
-                        }
-                        failure('error');
-                    }).catch(e => {
-                        failure(e);
-                    })
-                },
-                init_instance_callback: editor => {
-                    editor.on('Change MouseOut', e => {
-                        this.content = editor.getContent();
-                    });
-                }
-            });
+            this.initEditor();
+        },
+        destroyed() {
+            this.destroyEditor();
         },
         },
         data() {
         data() {
             return {
             return {
+                editor: null,
                 content: ''
                 content: ''
             }
             }
         },
         },
-        methods: {},
+        methods: {
+            load() {
+                console.log(1111)
+            },
+            initEditor() {
+                tinymce.init({
+                    target: this.$refs.editor,
+                    skin_url: '/static/skins/lightgray',
+                    language: 'zh_CN',
+                    menubar: false,
+                    branding: false,
+                    statusbar: false,
+                    height: 300,
+                    toolbar: 'undo redo | styleselect bold italic strikethrough forecolor backcolor  | image media link blockquote visualblocks insert | formatselect | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | preview fullscreen code help',
+                    plugins: [
+                        'advlist autolink lists link image charmap print preview anchor textcolor',
+                        'searchreplace visualblocks code fullscreen',
+                        'insertdatetime media table contextmenu paste code help imagetools'
+                    ],
+                    images_upload_url: this.$baseUrl + '/assets/uploadFile',
+                    images_upload_handler: function (blobInfo, success, failure) {
+                        let formData = new FormData();
+                        formData.append('file', blobInfo.blob(), blobInfo.filename());
+                        axios.post('/assets/uploadFile', formData).then(res => {
+                            if (res.status === 200) {
+                                if (res.data.success) {
+                                    success(res.data.data[0]);
+                                    return;
+                                }
+                            }
+                            failure('error');
+                        }).catch(e => {
+                            failure(e);
+                        })
+                    },
+                    init_instance_callback: editor => {
+                        this.editor = editor;
+                        this.editor.setContent(this.content);
+                        editor.on('Change MouseOut', e => {
+                            this.content = editor.getContent();
+                        });
+                    }
+                });
+            },
+            destroyEditor() {
+                if (this.editor) {
+                    this.editor.destroy();
+                }
+                this.editor = null;
+            }
+        },
         watch: {
         watch: {
             value(val) {
             value(val) {
+                if (this.editor) {
+                    this.editor.setContent(val);
+                }
                 this.content = val
                 this.content = val
             },
             },
             content(val) {
             content(val) {
                 this.$emit('input', val)
                 this.$emit('input', val)
+            },
+            disabled(val) {
+                if (val) {
+                    this.destroyEditor();
+                } else {
+                    this.$nextTick(() => {
+                        this.initEditor();
+                    })
+                }
             }
             }
         }
         }
     }
     }
 </script>
 </script>
+<style lang="less" scoped>
+    .preview {
+        height: 300px;
+        overflow: auto;
+        border: 1px solid #ebebeb;
+        background-color: #fbfdff;
+        border-radius: 4px;
+    }
+</style>