Explorar o código

20190530支付宝支付

suochencheng %!s(int64=6) %!d(string=hai) anos
pai
achega
80893526e5

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

@@ -29,5 +29,7 @@ public interface UserOrderService {
     double calculatedPrice(String orderId, double coin, double point);
 
     Result payOrder(String orderId, double coin, double point, double cash, int payMode);
+
+    void alipaySuccess(String tradeNo, String tradeStatus);
 }
 

+ 42 - 0
src/main/java/com/izouma/awesomeadmin/service/impl/UserOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.izouma.awesomeadmin.service.impl;
 import java.math.BigDecimal;
 import java.util.*;
 
+import com.izouma.awesomeadmin.dao.AlipayTempMapper;
 import com.izouma.awesomeadmin.dao.NavigationPackageMapper;
 import com.izouma.awesomeadmin.dto.Result;
 import com.izouma.awesomeadmin.model.*;
@@ -41,6 +42,10 @@ public class UserOrderServiceImpl implements UserOrderService {
     @Autowired
     private MarketCodeService marketCodeService;
 
+
+    @Autowired
+    private AlipayTempMapper alipayTempMapper;
+
     @Override
     public List<UserOrder> getUserOrderList(UserOrder record) {
 
@@ -338,5 +343,42 @@ public class UserOrderServiceImpl implements UserOrderService {
         return new Result(false, "支付失败");
     }
 
+
+    /**
+     * <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())) {
+
+                    payOrder(alipayTemp.getOrderId() + "", alipayTemp.getCoin().doubleValue(),
+                            alipayTemp.getPoint().doubleValue(), alipayTemp.getCash().doubleValue(), AppConstant.PayMode.ALIPAY);
+
+                    alipayTemp.setTradeStatus(tradeStatus);
+
+                    alipayTempMapper.updateByPrimaryKeySelective(alipayTemp);
+                }
+
+            }
+
+        } catch (Exception e) {
+            logger.error("alipaySuccess:支付宝支付成功回调接口异常 tradeNo:" + tradeNo + ", tradeStatus:" + tradeStatus, e);
+        }
+
+    }
+
+
 }
 

+ 32 - 0
src/main/java/com/izouma/awesomeadmin/util/AlipayClientFactory.java

@@ -45,6 +45,38 @@ public class AlipayClientFactory {
         return form;
     }
 
+    // 手机网页支付 网站支付
+    public static String app_Pay(Map<String, String> maps) throws AlipayApiException {
+
+        AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest ();
+        String NotifyUrl = maps.get("NotifyUrl");
+        String ReturnUrl = maps.get("ReturnUrl");
+        // 后台回调
+        if (!StringUtils.isEmpty(NotifyUrl)) {
+            alipayRequest.setNotifyUrl(NotifyUrl);
+            // bizContent 中不需要 公共参数
+            maps.remove("NotifyUrl");
+        }
+        // 页面回调
+        if (!StringUtils.isEmpty(ReturnUrl)) {
+            alipayRequest.setReturnUrl(ReturnUrl);
+            // bizContent 中不需要 公共参数
+            maps.remove("ReturnUrl");
+        }
+        String bizCon = JSONObject.fromObject(maps).toString();
+        alipayRequest.setBizContent(bizCon);
+        String form = "";
+        try {
+            //这里和普通的接口调用不同,使用的是sdkExecute
+            //getBody 就是orderString 可以直接给客户端请求,无需再做处理。
+            form = AlipayClientFactory.getAlipayClientInstance().sdkExecute(alipayRequest).getBody();
+        } catch (AlipayApiException e) {
+            form = "err";
+            e.printStackTrace();
+        } // 调用SDK生成表单
+        return form;
+    }
+
 
     // PC网页支付
     public static String PC_Pay(Map<String, String> maps) throws AlipayApiException {

+ 333 - 0
src/main/java/com/izouma/weixin/web/AlipayController.java

@@ -0,0 +1,333 @@
+package com.izouma.weixin.web;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.izouma.awesomeadmin.constant.AppConstant;
+import com.izouma.awesomeadmin.dao.AlipayTempMapper;
+import com.izouma.awesomeadmin.dto.Result;
+import com.izouma.awesomeadmin.model.AlipayTemp;
+import com.izouma.awesomeadmin.service.MemberCoinService;
+import com.izouma.awesomeadmin.service.UserInfoService;
+import com.izouma.awesomeadmin.service.UserOrderService;
+import com.izouma.awesomeadmin.util.AlipayClientFactory;
+import com.izouma.awesomeadmin.util.MbappUtil;
+import com.izouma.awesomeadmin.util.PropertiesFileLoader;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>支付宝相关控制。</p>
+ *
+ * @author 姓名 <br />
+ * 更新履历 <br />
+ * 日期 : 姓名: 更新内容<br />
+ * @version 1.0
+ */
+@Controller
+@RequestMapping("/aliapi")
+//url:/模块/资源/{id}/细分
+public class AlipayController {
+
+    private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(AlipayController.class);
+
+    @Autowired
+    private UserOrderService userOrderService;
+
+    @Autowired
+    private MemberCoinService memberCoinService;
+
+    @Autowired
+    private UserInfoService userInfoService;
+
+
+    @Autowired
+    private AlipayTempMapper alipayTempMapper;
+
+
+    @RequestMapping(value = "/appBuy", method = RequestMethod.GET)
+    @ResponseBody
+    public Result buy(@RequestParam(required = true, value = "orderId") String orderId,
+                      @RequestParam(required = true, value = "coin") double coin, @RequestParam(required = true, value = "point") double point) {
+
+        double cash = userOrderService.calculatedPrice(orderId, coin, point);
+        if (cash > 0) {
+            String totalAmount = cash + "";
+            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", totalAmount);
+            maps.put("subject", "一米世界-导航包");
+            maps.put("seller_id", PropertiesFileLoader.getProperties("ALIPAY_SELLER"));
+            // 下面两个 参数的 KEY 不要乱写 要和工具类里面对应
+            //maps.put("ReturnUrl", MbappUtil.getDomain(request) + "index#/close");
+            maps.put("NotifyUrl", PropertiesFileLoader.getProperties("base_domain") + "aliapi/async");
+            try {
+                String form = AlipayClientFactory.app_Pay(maps);
+                if (!form.equals("err")) {
+
+                    AlipayTemp alipayTemp = new AlipayTemp();
+
+                    alipayTemp.setOrderId(orderId);
+                    alipayTemp.setTotalAmount(BigDecimal.valueOf(cash));
+                    alipayTemp.setTradeStatus(AppConstant.Aliapi.WAIT_BUYER_PAY);
+                    alipayTemp.setOutTradeNo(outTradeNo);
+                    alipayTemp.setCoin(BigDecimal.valueOf(coin));
+                    alipayTemp.setPoint(BigDecimal.valueOf(point));
+                    alipayTemp.setCash(BigDecimal.valueOf(cash));
+
+                    alipayTempMapper.insertSelective(alipayTemp);
+
+                    return new Result(true, new StringBuilder(form));
+
+                }
+            } catch (AlipayApiException e) {
+                e.printStackTrace();
+            }
+
+        }
+        return new Result(false, "错误");
+    }
+
+
+    /**
+     * <p>充值舱豆。</p>
+     *
+     * @param request
+     * @param response
+     * @throws ServletException
+     * @throws IOException
+     */
+    @RequestMapping(value = "/recharge", method = RequestMethod.GET)
+    @ResponseBody
+    public Result recharge(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) + "index#/memberMoney");
+        maps.put("NotifyUrl", PropertiesFileLoader.getProperties("base_domain") + "aliapi/rechargeAsync");
+        try {
+            String form = AlipayClientFactory.app_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.RECHARGE);
+                alipayTempMapper.insertSelective(alipayTemp);
+
+                return new Result(true, new StringBuilder(form));
+            }
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+
+        return new Result(false, "错误");
+    }
+
+
+    /**
+     * 同步通知的页面的Controller
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/return_url")
+    public String Return_url(HttpServletRequest request, HttpServletResponse response) {
+
+        return "pay/success.html";
+    }
+
+
+    /**
+     * <p>充值回调接口。</p>
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/recharge_return_url")
+    public String recharge_return_url(HttpServletRequest request, HttpServletResponse response) {
+
+        return "pay/recharge_success.html";
+    }
+
+
+    /**
+     * 异步通知付款状态的Controller
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @SuppressWarnings("rawtypes")
+    @RequestMapping(value = "/async", method = RequestMethod.POST)
+    public String async(HttpServletRequest request, HttpServletResponse response) {
+
+        logger.info("支付宝支付订单回调");
+
+        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);
+
+            userOrderService.alipaySuccess(tradeNo, tradeStatus);
+            return "pay/success.html";
+        } else {//验证失败
+            return "pay/fail.html";
+        }
+
+    }
+
+
+    /**
+     * <p>充值异步通知付款状态。</p>
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @SuppressWarnings("rawtypes")
+    @RequestMapping(value = "/rechargeAsync", method = RequestMethod.POST)
+    public String rechargeAsync(HttpServletRequest request, HttpServletResponse response) {
+
+        logger.info("支付宝支付充值回调");
+
+        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);
+
+            memberCoinService.alipaySuccess(tradeNo, tradeStatus);
+            return "pay/cashPledge_success.html";
+        } else {//验证失败  
+            return "pay/cashPledge_fail.html";
+        }
+
+    }
+
+
+    @RequestMapping(value = "/refund", method = RequestMethod.GET)
+    @ResponseBody
+    public void refund(@RequestParam(required = true, value = "outTradeNo") String outTradeNo,
+                       @RequestParam(required = true, value = "refundAmount") double refundAmount) {
+
+        String bizContent = "{" + "    \"out_trade_no\":\"" + outTradeNo + "\"," + "    \"refund_amount\":" + refundAmount + ","
+                + "    \"refund_reason\":\"正常退款\"" + "  }";
+
+        try {
+            AlipayTradeRefundResponse response = AlipayClientFactory.refund(null, bizContent);
+            if (response.isSuccess()) {
+                System.out.println("调用成功");
+            } else {
+                System.out.println("调用失败");
+            }
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //产品名称:云通信短信API产品,开发者无需替换
+    static final String product = "Dysmsapi";
+    //产品域名,开发者无需替换
+    static final String domain = "dysmsapi.aliyuncs.com";
+
+    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
+    static final String accessKeyId = PropertiesFileLoader.getDefaultProperties("aliossid", "");
+    static final String accessKeySecret = PropertiesFileLoader.getDefaultProperties("aliosskey", "");
+
+    @RequestMapping(value = "/sendCode", method = RequestMethod.GET)
+    @ResponseBody
+    public Result sendCode(@RequestParam("phone") String mobile, @RequestParam("templateCode") String templateCode, HttpServletRequest httpRequest) {
+        try {
+            //验证码
+            String msgCode = MbappUtil.getRandomNum(6);
+
+            //可自助调整超时时间
+            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+            //初始化acsClient,暂不支持region化
+            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+            IAcsClient acsClient = new DefaultAcsClient(profile);
+
+            //组装请求对象-具体描述见控制台-文档部分内容
+            SendSmsRequest request = new SendSmsRequest();
+            //必填:待发送手机号
+            request.setPhoneNumbers(mobile);
+            //必填:短信签名-可在短信控制台中找到
+            request.setSignName("图忆途");
+            //必填:短信模板-可在短信控制台中找到
+            request.setTemplateCode(templateCode);
+            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+            request.setTemplateParam("{\"code\":\"" + msgCode + "\"}");
+
+            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
+            //request.setSmsUpExtendCode("90997");
+
+            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+            //request.setOutId("yourOutId");
+
+            //hint 此处可能会抛出异常,注意catch
+            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+
+            if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
+                //请求成功
+                httpRequest.getSession(true).setAttribute("aliMsgCode", msgCode);
+                return new Result(true, "发送成功");
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return new Result(false, "发送失败,请稍后重试");
+    }
+
+    @RequestMapping(value = "/verifyMsgCode", method = RequestMethod.GET)
+    @ResponseBody
+    public Result verifyMsgCode(HttpServletRequest request, @RequestParam("code") String code) {
+        String rand = (String) request.getSession(true).getAttribute("aliMsgCode");
+        if (code.toLowerCase().equals(rand)) {
+            return new Result(true, null);
+        } else {
+            return new Result(false, "验证码错误");
+        }
+    }
+
+}

+ 2 - 2
src/main/resources/properties/outsidews.properties

@@ -13,9 +13,9 @@ jwtsecret=3MgWy/pJjxHCQW2pHlQbkjomTUPRo9WhsPFjUPYZZlo=
 host=http://1eaed69e.ngrok.io
 base_domain=http://www.liuhuohuyu.com/
 ALIPAY_APP_ID=2016101100660827
-ALIPAY_APP_PRIVATE_KEY=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDNbcuW0ij0mOezs+mRAYoyXlN5jZzr8WaO4q1kXTy7Xu9+C3+vurYgrqb9j+IeVsph4rhyF9P98H0cFQABnumiV6jaY3/wke/9aj8uBV5zvHC3GrkSDUQotPAmE+blwqFdofQsaoOuHOR1FfstLg29jOaVipoNvkSGmOJqfIjAGaMEQy7p2S2jLIqyKGMj71TvoITAMCkkwbim0kmbN4reh5XPKTeT2upOa+64FNnYK3mJ141e2LNWNx2HAIhaw88+KUiHNXUS3LA+aGw0inZP3UdSPAetsEagNeD+NXNtWf7DeABn/0K8SGgUkScODeC8TesOpS5lcmVj5W5w9hK7AgMBAAECggEBAIzxG5Fqtza6AZ5FfaZDTDGqjdMD2fn3Mcous4/8eEKFrALqmLxUeciKi3/ES/tMyKXIC4wb1RKRAQVXUx3JjboYMn1Dbu/68JEJaDeG73qwexTlfLxp5a2YFnvJg813b4byKriei6HVqNi8MAybYEoAdeN7qJ5tQE6obg9pSdmhgg6tnza51ASlwepZqxQ2YDMvROg7KA2PHlIrdVhLBy0GGG3YvSxsl2jOmXst96mihYa6vD4rXZjVXnd+kwS+x5Mpw7tLdEkS+PSrFRFpW6W0LwnGcJm1lC3L5X8wQ+lXGT3X2TrZV4j+NCwTyn3WFr3yGRnLAzJD5vMJI/sTY8ECgYEA8o1+9ZW7XIvO+zIBEsq177pEYlqFoW2e8acokeYPXex6RmIhaikQVegnwSQcu8hvD2Gh0ozGEH1Y47vCvGi6Q9pswy4pT47BQyuir/8EVSPsO+2atWa/YXot0Gcmm2GSWXT/DNJViaGB+oT4m15mCDtzVeJIndytglx0TF9saFMCgYEA2NFob1K+fi4+NZD8WrkAnjPKodeOsu+YxNnB3E53xd8BgVLVgC9F/eEwDkbWazil5Wykwf07OGbBK5+rUv9w2DHJMHyaGQ5HpCRx06P2gxquFdudXjWwV+6TseEQDloyE13oKT8+oJBedYTNI3D6mjGv+ni+gksaU74WS0mtvvkCgYEAx5SSUTXBk6ceyyccJwBRsE6Oknd12Zy/2ov3IAYzws8g1eVNJXNgk6+RdqVmV0XXzMpDQ2K+Xzck+062MB3kloyWTgwfxezrLYAsP7EROZVzfuRGFtnSxDyqkf8uj1A8Agv5Ce3QoI0azK65ee60+jUg9BxcMDkzND8rGuSx6S0CgYAu2JAH/YjLGpK2YC0mLPLFO8t8TGa4oqwPXD1WrF2UkypwFsWqfIxS3mTTsNqDMCon9+FhSKWS+iCinE0YEbj//UHLCCEDaOJxxK4TXEnW6dzTPDA0OsVvOk0PEeG2OCa5qICQ6OlPJ+JA4gCwt6htyG6NX6lJ3ZBCp7+JZNH1gQKBgCbsC8LzVOLIw6GR87X0oeWTfq7KKVD6rMfG58jHpTSAdY6ge9f2CyxKhfUyemZtu7BsRCFeuI5NDmtmg5uXS6Nu1dL/R5Xs33mB64fwYX/kXErnrHYrCekC1uIM8I/hTyVfbUvoMArq+3s2W7KTmq63ygBEnNOAqomJDHeW+/wv
+ALIPAY_APP_PRIVATE_KEY=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCTI/tLyeADP1nOi5Wekg/lLBYssgxJJ2PjSZxmnalTJu5xaBZ5VxjozZ++3/M8ywhcYNH0/OQWr+ObzQL/6hQoeCU6xds0A0buhLNN5z3T0EbOz4zkNPd1uRWv3uJlRYZqKy23t1DK7wPkzfLljINMdI+wWfcNBwhRm9SfFSiyjNzI+N8y9SY8VV7uZABpnTU39/jUVBK2T7zzURSd/flen+ehVumn42aAGw2tBwJeMGKs/0czvaFVrTKDlklSOO2uJ7pYJK193FchBMZYa/qDsAzmHj5D8Frl9C5TWhvT2b3bBpZ+0DwlJnkoAXwGV9ZJ56gSwVv3vktant7IaQbjAgMBAAECggEAe9qUw8XI71LbCHYMWi6+fHxwqeyxVL54YTBsGyBpEBo8KW+hQ0AiMowrBCNEfo60mfXRpXNdlw80+sdF2B60GyCOzfsPuadshIdk2pVkQLAXeivQf6NqDUjfTWvCi9ZK/4Ea+YKv2jH4yBbnd3ugZbHT5XDE+M1Lnk4aWlIYMLn73foysQ4HAF3TmfkWlCoO7hkuFgmJzrFafygMwPshFBehfCaBwuLHe80aERKK9LZNDKPbvh1I9KXmmerCqCs2bd1DTvb/f1Srs/xOS+tcMd/VJ8GweCDlHKAGr4vmjLhggcuhP2zjy5s/0fkjzBGdIz/P3giVXROynAbnSVMG8QKBgQD05GYXo+T5bJ/acMlu8O2620LMZgpHQervL7xtHheqk05mDJoMoFdiD6F/EHUlEebbUW+6t/vUl7nd+8t2Uff239U4DTpIgoyutDuUGhR8rcgkvzum2dAQdI7bbaR8X+QQjqOGQfm+4g2DVHYDIOq5N716ic6wKUQQBNbsgb7BewKBgQCZ0IaLMnOZowVJDfFKJzUC8In1jx9WoWqVyVK/oqYwIfENgsAvvfxkmYOHx6CWyYSU77e8GwqqoQtzdNaapnVTe8WMmTE1Tpms+p804zvnCsRgypyXXBYowRatf4i9AZeDU+nWEmKBUzIT9iZu2ljexW6p5SVP+Y5cD+GvvNsPuQKBgC77Rm7QnZQQd9ZzfuGOzTzk5brK9LvY9JZwpQiWFlo+KnM/hapYdIs2jngPEzpKZey7geDjfSe6+AiTTuRjM1wkcwZu2zif+xdlMmzmV/nXaSdLnMkUzmrpwaJtNXo690kJ5GtUavJo8ci5Qm61OPLRs8M3fvSi5hDgrM7w0UTTAoGAIGvZ0EFkKIA6PvnXYF//Ro1ZJw9x9Zq0kroK3SX1jbO50bU7uVR8fN/234nuiZoUfihBPD8e8nRbq4x3J8XqeRxfuZEY1DmrHtD8+fLjz4Fvf091zlm0ugZpN0zoj55kR2RKp7rcVJIqvhZmZ3tSvDI1b05DnSXnIfSfB6HxMtECgYAEpGIONAisBbeHb/mLqMMBXCnU7Cu4jhv7zfZs6ju2ea3W5W5foRmkkQYj1fumg831WODli7HHa0yVPPZGa3mO09a0iHqWqJTuOCYXYOQm2F5hqHW6gru6udX6Oik5OjU415dKjxacRrsiH0UqUAOVzcF2hlG2ypNIIKfiVXN4pA==
 ALIPAY_CHARSET=utf-8
-ALIPAY_ALIPAY_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzW3LltIo9Jjns7PpkQGKMl5TeY2c6/FmjuKtZF08u17vfgt/r7q2IK6m/Y/iHlbKYeK4chfT/fB9HBUAAZ7poleo2mN/8JHv/Wo/LgVec7xwtxq5Eg1EKLTwJhPm5cKhXaH0LGqDrhzkdRX7LS4NvYzmlYqaDb5EhpjianyIwBmjBEMu6dktoyyKsihjI+9U76CEwDApJMG4ptJJmzeK3oeVzyk3k9rqTmvuuBTZ2Ct5ideNXtizVjcdhwCIWsPPPilIhzV1EtywPmhsNIp2T91HUjwHrbBGoDXg/jVzbVn+w3gAZ/9CvEhoFJEnDg3gvE3rDqUuZXJlY+VucPYSuwIDAQAB
+ALIPAY_ALIPAY_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB
 ALIPAY_SELLER=2088102179082444
 ALIPAY_GATEWAY=https://openapi.alipaydev.com/gateway.do
 weixin_mch_id=1533580721