支付宝电脑网站支付 alipay.trade.page.pay

只涉及支付接口 其他接口没有使用
支付宝官方文档:https://docs.open.alipay.com/270/105899/
支付接口文档 https://docs.open.alipay.com/270/alipay.trade.page.pay/
建议使用沙箱环境进行测试,沙箱接入 https://docs.open.alipay.com/200/105311

具体实现请参考文档和官方demo

注意事项:
请求支付页面
  • 调用sdk的参数封装成静态变量,通过配置文件导入
  • 确认支付宝公钥和商户私钥是否正确, 使用RSA2 签名,回调地址必须外网可以访问到
  • 使用对象封装请求参数
  • goods_detail类型为 com.alipay.api.domain.GoodsDetail
  • JSONObject bizJson = JSONObject.fromObject(bizContent);转为json格式
  • 使用HttpServletResponse 输出页面,避免中文乱码出现

    异步回调:
  • 参考文档使用sdk验证签名
  • 注意验证app_id 和 seller_id 等.
package com.youboy.order.controller.callback;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

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

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.youboy.alipay.constant.AlipayConfig;
import com.youboy.memberService.api.IQualificationService;
import com.youboy.order.api.hxpay.IBankDockingRecordsService;
import com.youboy.order.api.hxpay.IBankHxAccountService;
import com.youboy.order.exception.OrderWebOSException;
import com.youboy.pay.api.IPayService;
import com.youboy.pay.api.IPayWorker;
import com.youboy.pay.dto.PayBill;
import com.youboy.pay.dto.bank.BackCode;
import com.youboy.pay.dto.bank.GnetOrder;
import com.youboy.pay.exception.PayWebOSException;
import com.youboy.pay.utils.PaySta;
import com.youboy.shardSessionFilter.MemCacheManagerSpy;

/**
 * 支付宝回调
*/
@Controller
@RequestMapping("/zfb/callback")
public class ZfbPayBackOrderController {

    private final Logger logger = Logger.getLogger(ZfbPayBackOrderController.class);

    /**
     * 支付宝支付异步回调
     * @param model
     * @param request
     * @param response
     * @param session
     * @throws OrderWebOSException
     */
    @RequestMapping(value = "/payCallBack", method = RequestMethod.POST)
    @ResponseBody
    public String zfbPayCallBack(ModelMap model,
            HttpServletRequest request, HttpServletResponse response,
            HttpSession session) throws OrderWebOSException {
        boolean signVerified = checkRSA(request);
        if (!signVerified) { // 验证失败
            logger.error("不是支付宝的合法请求!");
            return "fail";
        }
        // 验证通知是否有效
        boolean checkedTrustiness = checkedTrustiness(request);
        if (!checkedTrustiness) {
            logger.error("支付宝请求异常!");
            return "fail";
        }
        if ("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status)) {//TRADE_FINISHED交易成功并结束
            ......
        } /*else if (trade_status.equals("TRADE_SUCCESS")) {
            // 判断该笔订单是否在商户网站中已经做过处理
            // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            // 如果有做过处理,不执行商户的业务程序

            // 注意:
            // 付款完成后,支付宝系统发送该交易状态通知
        }*/

         return "fail";
        
    }

    /**
     * 验证是否为支付宝的合法请求 --验证签名
     * @param request  获取到的请求
     * @return
     */
    private boolean checkRSA(HttpServletRequest request) {
        Map<String, String> params = new HashMap<String, String>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (Iterator<String> 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] + ",";
            }
            // 乱码解决,这段代码在出现乱码时使用
            /*
             * try {
             * valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
             * } catch (UnsupportedEncodingException e) {
             * logger.error("回调接收参数乱码",e);
             * }
             */
            params.put(name, valueStr);
        }
        logger.info("收到支付宝异步回调:");
        logger.info(params.toString());
        boolean signVerified = false;
        // 调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
                    AlipayConfig.sign_type);
            return signVerified;
        } catch (AlipayApiException e) {
            // 调试用,写文本函数记录程序运行情况是否正常
            String sWord = AlipaySignature.getSignCheckContentV1(params);
            AlipayConfig.logResult(sWord);
            logger.error("支付宝回调验证签名异常", e);
            return signVerified;
        }

    }

    // 验证支付
    private boolean checkedTrustiness(HttpServletRequest request) {
        // 验证成功
        String out_trade_no = "";
        String trade_status = "";
        String seller_id = "";
        String app_id = "";
        BigDecimal total_amount;
        try {
            // 商户订单号
            out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

            // 支付宝交易号
            // trade_no = new
            // String(request.getParameter("trade_no").getBytes("ISO-8859-1"),
            // "UTF-8");
            
            // 交易状态
            trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
            // 支付订单金额
            total_amount = new BigDecimal(
                    new String(request.getParameter("buyer_pay_amount").getBytes("ISO-8859-1"), "UTF-8"));
            // 卖家支付宝账号
            seller_id = new String(request.getParameter("seller_id").getBytes("ISO-8859-1"), "UTF-8");
            app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"), "UTF-8");

        } catch (UnsupportedEncodingException e) {
            logger.error("回调参数格式转换异常(payid=" + out_trade_no + ")", e);
            return false;
        }
        if (!"TRADE_FINISHED".equals(trade_status) && !"TRADE_SUCCESS".equals(trade_status)) {
            logger.error("支付宝返回的交易状态不正确(payid=" + out_trade_no + ")");
            return false;
        }
        // 2.验证out_trade_no是否正确
        PayBill bill = new PayBill();
        try {
            bill = payService.find(out_trade_no).get(0);
        } catch (PayWebOSException e) {
            logger.error("paybill 查询订单情况异常 (payid=" + out_trade_no + ")", e);
            return false;
        }
        // 3.判断totalamount
        if (!total_amount.equals(bill.getAmount()) ) {
            logger.error("支付宝返回的订单金额不正确(payid=" + out_trade_no + ")");
            return false;
        }
        // 支付状态是否正确
        if (PaySta.Success.equals(bill.getStatus())) {
            logger.error("订单状态不正确(payid=" + out_trade_no + ")");
            return false;
        }
        // 判断 seller_id
        if (!AlipayConfig.seller_id.equals(seller_id)) {
            logger.error("支付宝返回的seller_id不正确(payid=" + out_trade_no + ")");
            return false;
        }
        // 5.验证app_id
        if (!AlipayConfig.app_id.equals(app_id)) {
            logger.error("支付宝返回的app_id不正确(payid=" + out_trade_no + ")");
            return false;
        }
        return true;

    }

}

转载于:https://www.cnblogs.com/java-wp/p/8797420.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Vue.js 调用支付宝的接口需要以下几个步骤: 1. 在支付宝开放平台注册并创建应用,获取应用的 App ID 和密钥。 2. 安装 `vue-resource` 或 `axios`,这是用来发送 AJAX 请求的库。 3. 在 Vue.js 的组件中,调用支付宝的 API,需要使用 `vue-resource` 或 `axios` 的 `post` 方法,将请求参数以 JSON 格式传递给支付宝的接口。 以下是一个简单的示例代码,使用 `vue-resource` 发送请求: ```javascript <template> <div> <button @click="pay">支付宝支付</button> </div> </template> <script> import Vue from 'vue' import VueResource from 'vue-resource' Vue.use(VueResource) export default { methods: { pay() { const params = { app_id: 'your_app_id', method: 'alipay.trade.page.pay', charset: 'utf-8', sign_type: 'RSA2', timestamp: '2017-08-15 12:00:00', version: '1.0', biz_content: JSON.stringify({ out_trade_no: 'your_out_trade_no', product_code: 'FAST_INSTANT_TRADE_PAY', total_amount: 0.01, subject: '购买商品', body: '购买商品的详细描述' }), notify_url: 'http://www.example.com/notify_callback' } this.$http.post('https://openapi.alipay.com/gateway.do', params).then(response => { console.log(response.body) }) } } } </script> ``` 在这个示例中,我们调用了支付宝的 `alipay.trade.page.pay` 方法,传递了一些必要的参数,比如 `app_id`、`method`、`charset`、`sign_type`、`timestamp`、`version`、`biz_content` 和 `notify_url`。其中,`biz_content` 是一个 JSON 字符串,表示要支付的订单信息,比如订单号、金额、商品名称、商品描述等。最后,我们使用 `vue-resource` 的 `post` 方法发送请求,将返回的结果打印到控制台上。 注意:以上示例中的参数值仅供参考,请根据实际情况修改。另外,为了保证支付的安全性,建议将密钥等敏感信息存储在后端服务器上,不要直接在前端代码中暴露。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值