支付宝获取二维码充值

1.获取充值二维码

controller层获取二维码

@ResponseBody
@RequestMapping(value = "/alipay-qrcode", produces = MediaType.TEXT_HTML_VALUE)
    public String alipayQrcode(String orderId, String userType)
    {

//这里是提供给支付宝的参数,里面有订单的详细信息,订单的金额,订单号等等
        Recharge recharge = this.rechargeManager.get(orderId);
        if (!StringUtils.isEmpty(userType) && userType.equals("store"))
        {
            recharge.setUserType("store");
        }
        String qrimg = this.paymentManager.getRechargePayQrCdoe(recharge,
                "alipayDirectPlugin");//调用获取二维码
        return qrimg;//返回二维码
    }

2.调用getRechargePayQrCdoe方法获取二维码

public String getRechargePayQrCdoe(Recharge recharge, String pluginId) {
IPaymentQrCodeEvent event =  SpringContextHolder.getBean(pluginId);
PayCfg payCfg = this.get(pluginId);
String  code_url = event.onPayQrCode(payCfg, recharge);//这里有两个方法一个是支付宝还有一个是微信

//这里传的参数是alipayDirectPlugin是支付宝
return code_url;//返回一个URL
}

3.打包数据给支付宝,调用的是 onPayQrCode方法

public String onPayQrCode(PayCfg payCfg, PayEnable order) {//
try {
Map<String, String> params = paymentManager.getConfigParams(this.getId());
String out_trade_no = order.getSn(); // 商户网站订单
String partner =params.get("partner");  // 支付宝合作伙伴id (账户内提取)
String key =  params.get("key");  // 支付宝安全校验码(账户内提取)
String seller_email = params.get("seller_email"); // 卖家支付宝帐户
String content_encoding = params.get("content_encoding"); // 卖家支付宝帐户
String ckey = params.get("ckey");

            AlipayConfig.ckey = ckey;//商户的公钥
AlipayConfig.key=key;// 商户的私钥
AlipayConfig.partner=partner;// 合作身份者ID,以2088开头由16位纯数字组成的字符串
AlipayConfig.seller_email=seller_email;// 收款支付宝账号

String payment_type = "1";
//必填,不能修改
//服务器异步通知页面路径
String notify_url =this.getCallBackUrl(payCfg, order);
//需http://格式的完整路径,不能加?id=123这类自定义参数

//页面跳转同步通知页面路径
//String return_url = this.getReturnUrl(payCfg, order);
//需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/

//支付宝扫码支付中间跳转页路径
String jump_url= this.getAlipayJumpUrl(payCfg, order);

String show_url= this.getShowUrl(order);

//商户订单号
out_trade_no = new String( out_trade_no.getBytes("ISO-8859-1"),"UTF-8")  ;
//商户网站订单系统中唯一订单号,必填

String sitename = EopSite.getInstance().getSitename();
//订单名称
String subject =sitename+"订单";
//if(!StringUtil.isEmpty(content_encoding)){
// subject = new String(subject.getBytes("ISO-8859-1"),content_encoding);
//}
//必填


String body =  ("订单:"+out_trade_no);
// if(!StringUtil.isEmpty(content_encoding)){
// body=new String( body.getBytes("ISO-8859-1"),content_encoding);
// }

//付款金额
String price = new String

(String.valueOf( order.getNeedPayMoney()).getBytes("ISO-8859-1"),"UTF-8");


//把请求参数打包成数组
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("service", "create_direct_pay_by_user");
        sParaTemp.put("partner", AlipayConfig.partner);
        sParaTemp.put("seller_email", AlipayConfig.seller_email);
        sParaTemp.put("_input_charset", AlipayConfig.input_charset);
sParaTemp.put("payment_type", payment_type);
sParaTemp.put("notify_url", notify_url);
sParaTemp.put("return_url", jump_url);
sParaTemp.put("out_trade_no", out_trade_no);
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", price);
sParaTemp.put("body", body);
sParaTemp.put("show_url", show_url);
sParaTemp.put("anti_phishing_key", "");
sParaTemp.put("exter_invoke_ip", "");
sParaTemp.put("qr_pay_mode", "4");
sParaTemp.put("qrcode_width", "200");

return AlipaySubmit.buildRequest(sParaTemp,"get","确认");
} catch (Exception e) {
return "转码失败";
}
}

4.把请求参数打包成数组建立请求,以表单HTML形式构造,就是我们扫描的二维码

扫描二维码关注公众号,回复: 2416018 查看本文章

/**
     * 建立请求,以表单HTML形式构造(默认)
     * @param sParaTemp 请求参数数组
     * @param strMethod 提交方式。两个值可选:post、get
     * @param strButtonName 确认按钮显示文字
     * @return 提交表单HTML文本
     */
    public static String buildRequest(Map<String, String> sParaTemp, String strMethod, String strButtonName) {
        //待请求参数数组
        Map<String, String> sPara = buildRequestPara(sParaTemp);
        List<String> keys = new ArrayList<String>(sPara.keySet());

        StringBuffer sbHtml = new StringBuffer();

        sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + ALIPAY_GATEWAY_NEW
                      + "_input_charset=" + AlipayConfig.input_charset + "\" method=\"" + strMethod
                      + "\">");

        for (int i = 0; i < keys.size(); i++) {
            String name = (String) keys.get(i);
            String value = (String) sPara.get(name);

            sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>");
        }

        //submit按钮控件请不要含有name属性
        sbHtml.append("<input type=\"submit\" value=\"" + strButtonName + "\" style=\"display:none;\"></form>");
        sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");

        return sbHtml.toString();//这个就是我们扫描的二维码,里面包含了所有有的数据
    }


上面的onPayQrCode方法中有两个地方要特别注意!


(1)notify_url 异步通知路径,return_url 同步通知路径

String notify_url =this.getCallBackUrl(payCfg, order);

这个是异步通知路径调用getCallBackUrl 返回一个URL 

/**
* 供支付插件获取回调url
* @return
*/
protected String getCallBackUrl(PayCfg payCfg,PayEnable order){
// if(callbackUrl!=null)
// return callbackUrl;
HttpServletRequest request = ThreadContextHolder.getHttpRequest();

// if(SystemSetting.getWap_open()==1 && request.getServerName().equals(SystemSetting.getWap_domain()) ){
// return this.getReturnWapUrl(payCfg, order);
// }

String serverName =request.getServerName();
int port = request.getServerPort();
String portstr = "";
if(port!=80){
portstr = ":"+port;
}
String contextPath = request.getContextPath();
return "http://"+serverName+portstr+contextPath+"/api/shop/"+order.getOrderType()+"_"+payCfg.getType() +"_payment-callback/execute.do";
}

return是一个.do的URL去访问controller 


这个是.do的URL里面是处理客户的业务逻辑的。


下面是.do的controller看看是如何处理业务逻辑的


@Controller

@RequestMapping("/api/shop/*payment-callback")
public class PaymentCallbackApiController {
private Logger logger = Logger.getLogger(getClass());
@ResponseBody
@RequestMapping(value="/execute")
public String execute() {
try {
HttpServletRequest httpRequest = ThreadContextHolder.getHttpRequest();
String url = RequestUtil.getRequestUrl(httpRequest);
String pluginid = null;
String ordertype = null;
String[] params = this.getPluginid(url);//这个是URL中的参数下面是有这个方法怎么用的可以仿造
ordertype = params[0];
pluginid = params[1];

String error = "参数不正确";

if (null == pluginid) {
return error;
}

if (null == ordertype) {
return error;
}

IPaymentEvent paymentPlugin = SpringContextHolder.getBean(pluginid);
String result = paymentPlugin.onCallBack(ordertype);

this.logger.debug("支付回调结果:" + result);
return result;
} catch (Exception e) {
this.logger.error("支付回调发生错误", e);
return "error";
}

}


上面调用一个onCallBack方法,这个就是处理客户的业务逻辑

@Override
public String onCallBack(String ordertype) {
try {
Map<String, String> cfgparams = paymentManager.getConfigParams(this.getId());
String key = cfgparams.get("key");
String partner = cfgparams.get("partner");
String ckey = cfgparams.get("ckey");
            
                  AlipayConfig.ckey = ckey;
AlipayConfig.key = key;
AlipayConfig.partner = partner;

String param_encoding = cfgparams.get("param_encoding");
HttpServletRequest request = ThreadContextHolder.getHttpRequest();

// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
// 商户订单号
String out_trade_no = new String

(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 交易状态
String trade_status = new String

(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
//买家支付宝账号
String buyer_email = new String

(request.getParameter("buyer_email").getBytes("ISO-8859-1"), "UTF-8");
String sql = "select * from es_advance_logs where sn=?";
Recharge recharge = 

(Recharge) this.daoSupport.queryForObject(sql, Recharge.class, out_trade_no);
if (JavashopAlipayUtil.verify(param_encoding)) {// 验证成功
//////////////////////////////////////////////////////////////////////////////////////////
// 请在这里加上商户的业务逻辑程序代码
// ——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
if (trade_status.equals("TRADE_FINISHED")) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)

//在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 如果有做过处理,不执行商户的业务程序
if(recharge.getPay_status() != 2){

 //修改 判断订单是否已充值,pc端有问题请修改,这个只用来做供应商充值
//修改充值订单状态为已付款付款
this.daoSupport.execute

("update es_advance_logs set pay_status='2' where sn='"+recharge.getSn()+"'");
this.daoSupport.execute

("update es_member set advance=advance+"+recharge.getMoney()+" WHERE member_id="+recharge.getMember_id());
this.paySuccess(out_trade_no, trade_no,buyer_email, ordertype);
}
// 注意:
// 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (trade_status.equals("TRADE_SUCCESS")) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单 的详细,并执行商户的业务程序
// 如果有做过处理,不执行商户的业务程序
if(recharge.getPay_status() != 2){ //修改 判断订单是否已充值,pc端有问题请修改, 这个只用来做供应商充值
//修改充值订单状态为已付款付款
this.daoSupport.execute("update es_advance_logs set pay_status='2' where sn='"+recharge.getSn()+"'");
this.daoSupport.execute("update es_member set advance=advance+"+recharge.getMoney()+" WHERE member_id="+recharge.getMember_id());
this.paySuccess(out_trade_no, trade_no,buyer_email, ordertype);
}
// 注意:
// 付款完成后,支付宝系统发送该交易状态通知
}
// ——请根据您的业务逻辑来编写程序(以上代码仅作参考)—
return ("success"); // 请不要修改或删除
//////////////////////////////////////////////////////////////////////////////////////////
} else {// 验证失败
return ("fail");
}
} catch (Exception e) {
e.printStackTrace();
return ("fail");
}
}

上面有个重要的一个是验签

if (JavashopAlipayUtil.verify(param_encoding)) {// 验证成功

}

就直接贴代码了,验签


public static boolean verify(String param_encoding) {
try {
HttpServletRequest request = ThreadContextHolder.getHttpRequest();
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] + ",";
}


// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
if(!StringUtil.isEmpty(param_encoding)){
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), param_encoding);
//valueStr = URLDecoder.decode(URLDecoder.decode(valueStr, param_encoding), param_encoding);
}

params.put(name, valueStr);
}
// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
// 商户订单号
return (AlipayNotify.verify(params));
} catch (Exception e) {
e.printStackTrace();
return false;
}
}


调用这个方法return (AlipayNotify.verify(params));

就直接贴代码了

/* *
 *类名:AlipayNotify
 *功能:支付宝通知处理类
 *详细:处理支付宝各接口通知返回
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考

 *************************注意*************************
 *调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
 */
public class AlipayNotify {
    /**
     * 支付宝消息验证地址
     */
    private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&"
    /**
     * 验证消息是否是支付宝发出的合法消息
     * @param params 通知返回来的参数数组
     * @return 验证结果
     */
    public static boolean verify(Map<String, String> params) {
        //判断responsetTxt是否为true,isSign是否为true
        //responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
        //isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
    String responseTxt = "true";
if(params.get("notify_id") != null) {
String notify_id = params.get("notify_id");
responseTxt = verifyResponse(notify_id);
}
    String sign = "";
    if(params.get("sign") != null) {sign = params.get("sign");}
    boolean isSign = getSignVeryfy(params, sign);

        //写日志记录(若要调试,请取消下面两行注释)
        String sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign + "\n 返回回来的参数:" + AlipayCore.createLinkString(params);
        System.out.println(sWord);
  //  AlipayCore.logResult(sWord);

        if (isSign && responseTxt.equals("true")) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 根据反馈回来的信息,生成签名结果
     * @param Params 通知返回来的参数数组
     * @param sign 比对的签名结果
     * @return 生成的签名结果
     */
private static boolean getSignVeryfy(Map<String, String> Params, String sign) {
    //过滤空值、sign与sign_type参数
    Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
        //获取待签名字符串
        String preSignStr = AlipayCore.createLinkString(sParaNew);
        //获得签名验证结果
        boolean isSign = false;
        if(AlipayConfig.sign_type.equals("MD5") ) {
        isSign = MD5.verify(preSignStr, sign, AlipayConfig.ckey, AlipayConfig.input_charset);
        }
        else if(AlipayConfig.sign_type.equals("RSA") ){
        isSign = RSA.verify(preSignStr, sign, AlipayConfig.ckey, AlipayConfig.input_charset);
        }
        return isSign;
    }


    /**
    * 获取远程服务器ATN结果,验证返回URL
    * @param notify_id 通知校验ID
    * @return 服务器ATN结果
    * 验证结果集:
    * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
    * true 返回正确信息
    * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
    */
    private static String verifyResponse(String notify_id) {
        //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求

        String partner = AlipayConfig.partner;
        String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id;

        return checkUrl(veryfy_url);
    }

    /**
    * 获取远程服务器ATN结果
    * @param urlvalue 指定URL路径地址
    * @return 服务器ATN结果
    * 验证结果集:
    * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
    * true 返回正确信息
    * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
    */
    private static String checkUrl(String urlvalue) {
        String inputLine = "";
        try {
            URL url = new URL(urlvalue);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection
                .getInputStream()));
            inputLine = in.readLine().toString();
        } catch (Exception e) {
            e.printStackTrace();
            inputLine = "";
        }

        return inputLine;
    }
}


//获得签名验证结果 调用了isSign = MD5.verify(preSignStr, sign, AlipayConfig.ckey, AlipayConfig.input_charset);

直接贴代码

/** 
* 功能:支付宝MD5签名处理核心文件,不需要修改
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个
* */
public class MD5 {
    /**
     * 签名字符串
     * @param text 需要签名的字符串
     * @param key 密钥
     * @param input_charset 编码格式
     * @return 签名结果
     */
    public static String sign(String text, String key, String input_charset) {
    text = text + key;
        return DigestUtils.md5Hex(getContentBytes(text, input_charset));
    }
    
    /**
     * 签名字符串
     * @param text 需要签名的字符串
     * @param sign 签名结果
     * @param key 密钥
     * @param input_charset 编码格式
     * @return 签名结果
     */
    public static boolean verify(String text, String sign, String key, String input_charset) {
    text = text + key;
    String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
    if(mysign.equals(sign)) {
    return true;
    }
    else {
    return false;
    }
    }

    /**
     * @param content
     * @param charset
     * @return
     * @throws SignatureException
     * @throws UnsupportedEncodingException 
     */
    private static byte[] getContentBytes(String content, String charset) {
        if (charset == null || "".equals(charset)) {
            return content.getBytes();
        }
        try {
            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
        }
    }

}

整个验证走完之后就可以写业务逻辑了

if (JavashopAlipayUtil.verify(param_encoding)) {// 验证成功

//该加钱的加钱

//该修改状态的修改状态

}


下面的方法是上面controller获取URL中的参数,这个不是重点

String[] params = this.getPluginid(url);//这个是URL中的参数

/**
* @param url
* @return 
*/
private String[] getPluginid(String url) {
String pluginid = null;
String ordertype = null;
String[] params = new String[2];
String pattern = ".*/(\\w+)_(\\w+)_(payment-callback)/execute.do(.*)";
Pattern p = Pattern.compile(pattern, 2 | Pattern.DOTALL);
Matcher m = p.matcher(url);
if (m.find()) {
ordertype = m.replaceAll("$1");
pluginid = m.replaceAll("$2");
params[0] = ordertype;
params[1] = pluginid;
return params;
} else {
return null;
}
}


上面是异步,还有一个同步

(2)return_url同步通知路径

我也是个小白,听同事说业务逻辑在异步中处理,所以同步没有怎么做,但是大体上都是一样处理的  把代码贴上上去吧,都是一样处理方式

我跳转的是一个通知用户的页面就是同步通知,我把变量名换了而已

//支付宝扫码支付中间跳转页路径
String jump_url= this.getAlipayJumpUrl(payCfg, order);

/**
* 支付宝中间跳转页
* @param payCfg
* @param order
* @return
*/
protected String getAlipayJumpUrl(PayCfg  payCfg,PayEnable order){
HttpServletRequest request  =  ThreadContextHolder.getHttpRequest();
String serverName =request.getServerName();
int port =request.getServerPort();
String portstr = "";
if(port!=80){
portstr = ":"+port;
}
String contextPath = request.getContextPath();
if("credit".equals(order.getOrderType())){
            if(!StringUtils.isEmpty(order.getUserType()) && order.getUserType().equals("store")){
//                return          "http://"+serverName+portstr+contextPath+"/"+order.getOrderType()+"_"+payCfg.getType()+"_creditStore- result.html" ;
              return "http://"+serverName+portstr+contextPath+"/new_store/pages/account/zhifu_back_jumping.html? orderId="+order.getSn()+"&pluginId=alipayDirectPlugin";
            }
            return "http://"+serverName+portstr+contextPath+"/"+order.getOrderType()+"_"+payCfg.getType()+"_credit- result.html" ;
        }else{
            return "http://"+serverName+portstr+contextPath+"/pay-back-jumping.html? orderId="+order.getOrder_id()+"&pluginId=alipayDirectPlugin";
//            return "http://"+serverName+portstr+contextPath+"/"+order.getOrderType()+"_"+payCfg.getType()+"_payment- result.html" ;
        }
}

这个是跳转到这个html通知用户的 zhifu_back_jumping.html 先写下面这个一个然后在跳另一个展示数据的页面qr-payment-result.html

<!-- 此页只用于支付宝充值后,跳转至支付状态展示页 --> 
<script>window.parent.location.href="${ctx}/new_store/pages/account/qr-payment-result.html?orderId=${orderId}&pluginId=${pluginId}&trade_status=${trade_status}";</script>

下面是qr-payment-result.html

这个是freemaker不是jsp,都一样只是为了展示数据给用户知道

<#--创建支付结果标签-->
<#assign rechargeResultForQrTag = newTag("rechargeResultForQrTag") />
<#assign paymentResult = rechargeResultForQrTag()/>

<#--创建订单详细标签-->
<#assign orderDetailTag = newTag("rechargeDetailByOrderSn")>
<#assign orderDetail = orderDetailTag("{'ordersn':'${paymentResult.ordersn!''}'}")>
<div class="app-nav">
    <ul class="list-nav" onclick="location.reload(); ">
        <li><a href="javascript: void(0); ">充值结果</a></li>
    </ul>
</div>
<!--主页面区↓-->
<div class="app-wappler">
    <div class="inner-app-wappler">
<div class="setting-box">
<div class="payment-result">
<#if paymentResult.result==1>
<div class="payment-result-left">
<h1>充值成功</h1>
<h2>${(orderDetail.money!0)?string.currency}<i>元</i></h2>
<p>本网站不会以任何理由要求您提供银行卡信息或支付额外费用</p>
</div> 
<#else>
<div class="payment-result-left no-pay">
<h4>充值失败</h4>
<p>本网站不会以任何理由要求您提供银行卡信息或支付额外费用</p>
</div>
</#if>
</div>
</div>
</div>
</div>
</body>
</html>


同步通知也写了业务逻辑(不知道到底需不需要写)

/**
 * 
 * 扫码支付充值读取支付结果标签
 * @version 
 * @since JDK 1.7
 */
@Component
public class RechargeResultForQrTag extends BaseFreeMarkerTag {

@Autowired
private IPaymentManager paymentManager;
@Autowired
private IOrderManager orderManager;
@Autowired
    private IMemberAccountManager memberAccountManager;
@Autowired
private IDaoSupport daoSupport;

@Override
protected Object exec(Map params) throws TemplateModelException {

PaymentResult paymentResult = new PaymentResult();
Member member = UserConext.getCurrentMember();

//支付状态 1:支付成功 {内网支付不能更改订单付款状态 (仅支付宝扫码支付方式)},0:支付出现问题,

HttpServletRequest request = ThreadContextHolder.getHttpRequest();
String orderId = request.getParameter("orderId");

Recharge order = this.memberAccountManager.getRechargeOrder(orderId);

if(!member.getMember_id().equals(order.getMember_id())){
paymentResult.setResult(2);
paymentResult.setError("当前用户不存在此订单!");
paymentResult.setOrdersn(order.getSn());
return paymentResult;
}

String pluginId = request.getParameter("pluginId");
String trade_status = request.getParameter("trade_status");
System.out.println("pluginId:"+pluginId+"trade_status:"+trade_status);
//判断 pluginId不是null && pluginId 是支付宝支付 && trade_status支付状态不是null && (支付状态为TRADE_FINISHED 或者 TRADE_SUCCESS 都是支付成功 )
if(pluginId!=null && pluginId.equals("alipayDirectPlugin")&& trade_status!=null && (trade_status.equals("TRADE_FINISHED")|| trade_status.equals("TRADE_SUCCESS"))){
paymentResult.setResult(1);
paymentResult.setOrdersn(order.getSn());
paymentResult.setOrderType(order.getOrderType());
double money = order.getMoney();
if(order.getPay_status() != 2){//判断是否已支付
String sql = "update es_member set advance = advance + "+money+" where member_id ="+order.getMember_id();
this.daoSupport.execute(sql);
    sql = "update es_advance_logs set pay_status = 2 where sn ="+order.getSn();
this.daoSupport.execute(sql);
}
// 判断 pluginId不是null && pluginId 是支付宝支付 && trade_status支付状态不是null && 支付状态为 SUCCESS 是支付成功
}else if(pluginId!=null && pluginId.equals("weixinPayPlugin")&& trade_status!=null && trade_status.equals("SUCCESS")){
paymentResult.setResult(1);
paymentResult.setOrdersn(order.getSn());
double money = order.getMoney();
//支付成功时给账号余额加钱
String sql = "update es_member set advance = advance + "+money+" where member_id ="+order.getMember_id();
this.daoSupport.execute(sql);
}else {
paymentResult.setResult(0);
paymentResult.setError("支付出现问题");
}
System.out.println("paymentResult:"+paymentResult);
return paymentResult;
}
}

整个扫描二维码充值就是这样。

猜你喜欢

转载自blog.csdn.net/whatisthespring/article/details/78951517