精华内容
下载资源
问答
  • 对接支付宝支付接口开发详细步骤

    万次阅读 多人点赞 2017-08-07 10:25:28
    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧。 第一步:(先要在支付宝进行操做...

    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧。

    第一步:(先要在支付宝进行操做,拿到我们需要开发的信息后在动代码)

    进入蚂蚁金服,我们先要创建应用 看到图下的应用按钮了吗?

    点击应用(如下图)

    创建应用(创建应用需要审核)提供资料审核吧,这个时候我们就不用管他了。审核通过就可以用了。

    但是他审核我们也不能闲着着 ,我们先弄个测试把代码写出来,等审核沟通过后我们这边在替换审核后的信息即可。

    第二步(使用沙箱环境进行开发)

    看到APPID了吗这个很重要,我们支付的时候需要用到它,当前审核的后的信息里也会有,这个沙箱就是给我们测试用的,和正式几乎是一致的,只是切换不同的APPID和支付宝网关。(这里我要吐槽一下微信支付,微信支付说真的文档太烂,坑太多,后续我也会把微信支付对接弄上来。)支付宝还有一个好的地方就是旁边的机器人了,这个很到位,有不会的呼叫一下即可(小技巧:使用机器人,问题多打几次,人工就出来了,要不人工出不来呢。)

    在这个界面需要设定应用公钥

    点击打开设置应用公钥(其他不用设定)点击设置应用公钥

    ok ,这里是输入公钥的地方,如何生成钥匙,请点击查看生成秘钥方法(下图,下载钥匙生成工具)

    下载后按照说明打开(切记安照说明进行打开

    点击生成秘钥(这里注意:不要去验签你生成的秘钥,因为你验签会失败)我们直接拷贝生成的公钥放入即可。

     

    这里也不需要验证公钥的准确性 直接点击保存即可。

    第三步:导入alipay的jar包(jar包在)

    https://docs.open.alipay.com/54/104506/ 这个是支付demo 里面有jar 包,导入即可。

     

    第四步:编写代码

    创建一个AppPayConfig 类如下图放入对应的值即可

    编写action 类

    ok 到此支付宝就对接完毕了,当然上面有个异步回调地址,这个接口也是需要些的,我这了就不贴出来了。不知道大家能不能看明白,如果还有模糊,可以呼叫我吧。谢谢大家的阅读。

     

    展开全文
  • 商户对接 支付宝支付

    2019-02-21 17:59:31
    商户对接 支付宝支付 源码更容易查看 理解!
  • destoon对接支付宝支付,介绍了destoon如何对接支付宝支付功能,从支付宝企业号申请到网站支付成功,亲测成功
  • Python对接支付宝支付自实现# -*- coding: utf-8 -*-import base64import jsonimport urllib.parsefrom datetime import datetimeimport requestsfrom cryptography.hazmat.backends import default_backendfrom ...

    Python对接支付宝支付自实现

    # -*- coding: utf-8 -*-

    import base64

    import json

    import urllib.parse

    from datetime import datetime

    import requests

    from cryptography.hazmat.backends import default_backend

    from cryptography.hazmat.primitives import hashes

    from cryptography.hazmat.primitives import serialization

    from cryptography.hazmat.primitives.asymmetric import padding

    class AliPayException(Exception):

    def __init__(self, data):

    super(AliPayException, self).__init__()

    self.data = data

    def __str__(self):

    return "alipay - {}".format(self.data)

    def __unicode__(self):

    return u"alipay - {}".format(self.data)

    class AliPayVerifyException(AliPayException):

    def __init__(self, msg, data):

    super(AliPayVerifyException, self).__init__('alipay verify except - {}:{}'.format(msg, data))

    class AliPay:

    def __init__(self, **kwargs):

    """

    :param kwargs:

    url: 请求地址

    notify_url: 支付宝服务器主动通知商户服务器里指定的页面http/https路径

    app_id: 支付宝分配给开发者的应用ID

    sign_type: 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2

    app_private_key: 签名私钥

    """

    self._app_id = kwargs['app_id']

    self._seller_id = kwargs['seller_id']

    self._gateway_url = kwargs['gateway_url']

    self._notify_url = kwargs.get('notify_url')

    self._sign_type = kwargs.get('sign_type', 'RSA2')

    if self._sign_type not in ('RSA', 'RSA2'):

    raise Exception('alipay sign_type must `RSA` or `RSA2`')

    self._charset = 'utf-8'

    self._format = 'json'

    with open(kwargs['app_private_key']) as f:

    self._app_private_key = serialization.load_pem_private_key(

    f.read().encode('utf8'),

    None,

    default_backend()

    )

    with open(kwargs['public_key']) as f:

    self._public_key = serialization.load_pem_public_key(

    f.read().encode('utf8'),

    default_backend()

    )

    @property

    def app_id(self):

    return self._app_id

    @property

    def seller_id(self):

    return self._seller_id

    def app_private_sign(self, data):

    if self._sign_type == 'RSA':

    signature = self._app_private_key.sign(

    data.encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA1())

    else:

    signature = self._app_private_key.sign(

    data.encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA256())

    return base64.b64encode(signature).decode('utf8')

    def sync_verify(self, method, raw_data):

    """

    同步验签

    :return:

    """

    method = method.replace('.', '_') + '_response'

    raw_data = raw_data.decode('utf8')

    sign_index = raw_data.rfind('sign')

    signature = base64.b64decode(raw_data[sign_index + 7: -2])

    method_data = raw_data[raw_data.find(method) + len(method) + 2: sign_index - 2]

    self._public_key.verify(

    signature,

    method_data.encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA256())

    def async_verify(self, data):

    """

    异步验签

    :return:

    """

    sign_data = {}

    for k, v in data.items():

    if k in ('sign', 'sign_type'):

    continue

    sign_data[k] = v

    self._public_key.verify(

    base64.b64decode(data['sign']),

    '&'.join(['{}={}'.format(item) for item in self.sort_data(sign_data)]).encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA256())

    @staticmethod

    def sort_data(data):

    return [(k, data[k]) for k in sorted(data.keys())]

    def params(self, method, biz_content):

    data = {

    'app_id': self._app_id,

    'method': method,

    'format': self._format,

    'charset': self._charset,

    'sign_type': self._sign_type,

    'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), # yyyy-MM-dd HH:mm:ss

    'version': '1.0',

    'biz_content': json.dumps(biz_content, separators=(',', ':'))

    }

    if self._notify_url:

    data['notify_url'] = self._notify_url

    sign = self.app_private_sign('&'.join(['{}={}'.format(item) for item in self.sort_data(data)]))

    p = '&'.join(['{}={}'.format(item[0], urllib.parse.quote(item[1])) for item in self.sort_data(data)])

    p += '&{}={}}'.format('sign', urllib.parse.quote(sign))

    return p

    def command(self, method, biz_content):

    params = self.params(method, biz_content)

    response = requests.get('%s?%s' % (self._gateway_url, params))

    response_raw_data = response.content

    response_data = response.json()

    alipay_response_data = response_data[method.replace('.', '_') + '_response']

    if alipay_response_data.get('code', '10000') != '10000':

    raise AliPayException(alipay_response_data)

    self.sync_verify(method, response_raw_data)

    return alipay_response_data

    if __name__ == '__main__':

    alipay = AliPay(**{

    'app_id': '...',

    'seller_id': '...',

    'gateway_url': 'https://openapi.alipaydev.com/gateway.do',

    'notify_url': '...',

    'app_private_key': 'path to private_key.pem',

    'public_key': 'path to public_key.pem'

    })

    biz_content = {

    'out_trade_no': "111",

    'total_amount': 0.01,

    'subject': "test",

    }

    alipay.command('alipay.trade.precreate', biz_content)

    展开全文
  • Python对接支付宝支付自实现# -*- coding: utf-8 -*-import base64import jsonimport urllib.parsefrom datetime import datetimeimport requestsfrom cryptography.hazmat.backends import default_backendfrom ...

    Python对接支付宝支付自实现

    # -*- coding: utf-8 -*-

    import base64

    import json

    import urllib.parse

    from datetime import datetime

    import requests

    from cryptography.hazmat.backends import default_backend

    from cryptography.hazmat.primitives import hashes

    from cryptography.hazmat.primitives import serialization

    from cryptography.hazmat.primitives.asymmetric import padding

    class AliPayException(Exception):

    def __init__(self, data):

    super(AliPayException, self).__init__()

    self.data = data

    def __str__(self):

    return "alipay - {}".format(self.data)

    def __unicode__(self):

    return u"alipay - {}".format(self.data)

    class AliPayVerifyException(AliPayException):

    def __init__(self, msg, data):

    super(AliPayVerifyException, self).__init__('alipay verify except - {}:{}'.format(msg, data))

    class AliPay:

    def __init__(self, **kwargs):

    """

    :param kwargs:

    url: 请求地址

    notify_url: 支付宝服务器主动通知商户服务器里指定的页面http/https路径

    app_id: 支付宝分配给开发者的应用ID

    sign_type: 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2

    app_private_key: 签名私钥

    """

    self._app_id = kwargs['app_id']

    self._seller_id = kwargs['seller_id']

    self._gateway_url = kwargs['gateway_url']

    self._notify_url = kwargs.get('notify_url')

    self._sign_type = kwargs.get('sign_type', 'RSA2')

    if self._sign_type not in ('RSA', 'RSA2'):

    raise Exception('alipay sign_type must `RSA` or `RSA2`')

    self._charset = 'utf-8'

    self._format = 'json'

    with open(kwargs['app_private_key']) as f:

    self._app_private_key = serialization.load_pem_private_key(

    f.read().encode('utf8'),

    None,

    default_backend()

    )

    with open(kwargs['public_key']) as f:

    self._public_key = serialization.load_pem_public_key(

    f.read().encode('utf8'),

    default_backend()

    )

    @property

    def app_id(self):

    return self._app_id

    @property

    def seller_id(self):

    return self._seller_id

    def app_private_sign(self, data):

    if self._sign_type == 'RSA':

    signature = self._app_private_key.sign(

    data.encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA1())

    else:

    signature = self._app_private_key.sign(

    data.encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA256())

    return base64.b64encode(signature).decode('utf8')

    def sync_verify(self, method, raw_data):

    """

    同步验签

    :return:

    """

    method = method.replace('.', '_') + '_response'

    raw_data = raw_data.decode('utf8')

    sign_index = raw_data.rfind('sign')

    signature = base64.b64decode(raw_data[sign_index + 7: -2])

    method_data = raw_data[raw_data.find(method) + len(method) + 2: sign_index - 2]

    self._public_key.verify(

    signature,

    method_data.encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA256())

    def async_verify(self, data):

    """

    异步验签

    :return:

    """

    sign_data = {}

    for k, v in data.items():

    if k in ('sign', 'sign_type'):

    continue

    sign_data[k] = v

    self._public_key.verify(

    base64.b64decode(data['sign']),

    '&'.join(['{}={}'.format(item) for item in self.sort_data(sign_data)]).encode('utf8'),

    padding.PKCS1v15(),

    hashes.SHA256())

    @staticmethod

    def sort_data(data):

    return [(k, data[k]) for k in sorted(data.keys())]

    def params(self, method, biz_content):

    data = {

    'app_id': self._app_id,

    'method': method,

    'format': self._format,

    'charset': self._charset,

    'sign_type': self._sign_type,

    'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), # yyyy-MM-dd HH:mm:ss

    'version': '1.0',

    'biz_content': json.dumps(biz_content, separators=(',', ':'))

    }

    if self._notify_url:

    data['notify_url'] = self._notify_url

    sign = self.app_private_sign('&'.join(['{}={}'.format(item) for item in self.sort_data(data)]))

    p = '&'.join(['{}={}'.format(item[0], urllib.parse.quote(item[1])) for item in self.sort_data(data)])

    p += '&{}={}}'.format('sign', urllib.parse.quote(sign))

    return p

    def command(self, method, biz_content):

    params = self.params(method, biz_content)

    response = requests.get('%s?%s' % (self._gateway_url, params))

    response_raw_data = response.content

    response_data = response.json()

    alipay_response_data = response_data[method.replace('.', '_') + '_response']

    if alipay_response_data.get('code', '10000') != '10000':

    raise AliPayException(alipay_response_data)

    self.sync_verify(method, response_raw_data)

    return alipay_response_data

    if __name__ == '__main__':

    alipay = AliPay(**{

    'app_id': '...',

    'seller_id': '...',

    'gateway_url': 'https://openapi.alipaydev.com/gateway.do',

    'notify_url': '...',

    'app_private_key': 'path to private_key.pem',

    'public_key': 'path to public_key.pem'

    })

    biz_content = {

    'out_trade_no': "111",

    'total_amount': 0.01,

    'subject': "test",

    }

    alipay.command('alipay.trade.precreate', biz_content)

    展开全文
  • java对接支付宝功能

    2021-02-21 15:29:59
    java对接支付宝
  • java对接支付宝支付demo,支付宝官方案例。代码很全,拿来就可以用
  • 主要介绍了Python对接支付宝支付自实现功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Java对接支付宝支付

    2019-11-26 15:59:49
    Java对接支付宝支付 准备工具 SpringBoot工程构建 导入支付宝支付的maven依赖 获取支付宝的API 密钥,支付宝公钥,支付宝私钥等配置文件 定义当面支付的地址 https://openapi.alipay.com/gateway.do ```java <...

    Java对接支付宝支付

    准备工具
    SpringBoot工程构建
    导入支付宝支付的maven依赖
    获取支付宝的API 密钥,支付宝公钥,支付宝私钥等配置文件
    定义当面支付的地址
    https://openapi.alipay.com/gateway.do

    <dependency>
                <groupId>com.alipay.sdk</groupId>
                <artifactId>alipay-sdk-java</artifactId>
                <version>4.3.0.ALL</version>
            </dependency>
    
            <dependency>
                <groupId>com.ibeetl</groupId>
                <artifactId>beetl</artifactId>
                <version>${beetl.version}</version>
            </dependency>
            <dependency>
                <groupId>net.sourceforge.jexcelapi</groupId>
                <artifactId>jxl</artifactId>
                <version>2.6.10</version>
            </dependency>
    
            <dependency>
                <groupId>net.sf.json-lib</groupId>
                <artifactId>json-lib</artifactId>
                <version>2.4</version>
                <classifier>jdk15</classifier>
            </dependency>
        </dependencies>
    
    package com.jowim.service.impl;
    
    import com.alibaba.fastjson.JSON;
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.internal.util.AlipaySignature;
    import com.alipay.api.request.AlipayTradePayRequest;
    import com.alipay.api.request.AlipayTradePrecreateRequest;
    import com.alipay.api.request.ZolozAuthenticationCustomerSmilepayInitializeRequest;
    import com.alipay.api.response.AlipayTradePayResponse;
    import com.alipay.api.response.AlipayTradePrecreateResponse;
    import com.alipay.api.response.ZolozAuthenticationCustomerSmilepayInitializeResponse;
    import com.jowim.constant.ResultConstants;
    import com.jowim.entity.Orders;
    import com.jowim.entity.Product;
    import com.jowim.entity.ProductInOrders;
    import com.jowim.entity.Site;
    import com.jowim.mapper.ProductInOrdersMapper;
    import com.jowim.mapper.ProductMapper;
    import com.jowim.service.IAliPayMethod;
    import com.jowim.service.IOrdersService;
    import com.jowim.service.IRedisCache;
    import com.jowim.service.ISiteService;
    import com.jowim.tool.FavoritesHelper;
    import com.jowim.util.ResponseMessage;
    import org.apache.catalina.servlet4preview.http.HttpServletRequest;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.transaction.interceptor.TransactionAspectSupport;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.UnsupportedEncodingException;
    import java.math.BigDecimal;
    import java.util.*;
    
    @Service
    public class AlipayMethodImpl implements IAliPayMethod {
    
    
        /**
         * 站点
         */
        @Autowired
        private ISiteService iSiteService;
        /**
         * 订单
         */
        @Autowired
        private IOrdersService iOrdersService;
    
        /**
         * 订单内商品
         */
        @Autowired
        private ProductInOrdersMapper productInOrdersMapper;
    
        /**
         * 产品
         */
        @Autowired
        private ProductMapper productMapper;
        /**
         * 缓存
         */
        @Autowired
        private IRedisCache iRedisCache;
        private final static Logger log = LoggerFactory.getLogger(AlipayMethodImpl.class);
    
        public static String siteID = "355e307afbe95a9c85cfb9732fef204d";
        //当面支付
        private static final String URL = "https://openapi.alipay.com/gateway.do";
    
        //通知地址,自己的实际回调接口
        private static final String notify_url = "";
        // 编码
        public static String CHARSET = "UTF-8";
        // 返回格式
        public static String FORMAT = "json";
        public static String SIGNTYPE = "RSA2";
    
        /**
         * 支付宝支付码支付
         *
         * @param json
         * @param httpRequest
         * @param httpResponse
         * @return
         */
        @Override
        @Transactional
        public ResponseMessage<Object> doPost(String json, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws AlipayApiException {
            //商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
            String orderNo = JSON.parseObject(json).getString("orderNo");
            //支付授权码,25~30开头的长度为16~24位的数字,实际字符串长度以开发者获取的付款码长度为准
            String authCode = JSON.parseObject(json).getString("authCode");
            //订单标题
            String subject = JSON.parseObject(json).getString("subject");
            if (FavoritesHelper.isNull(orderNo) || FavoritesHelper.isNull(subject)) {
                return ResponseMessage.error(ResultConstants.RESULT_NULL);
            }
            Site site = iSiteService.selectById(siteID);
            String appId = site.getAppId();
            String publicKey = site.getAliPublicKey();
            String privateKey = site.getAliPrivateKey();
            Orders orders = iOrdersService.selectById(orderNo);
            if (null == orders) {
                return ResponseMessage.error("未查询到该订单,请重试!");
            }
            BigDecimal moneys = orders.getSalesAmount();
            AlipayClient alipayClient = new DefaultAlipayClient(URL, appId, privateKey, FORMAT, CHARSET, publicKey, SIGNTYPE); //获得初始化的AlipayClient
            AlipayTradePayRequest alipayRequest = new AlipayTradePayRequest();//创建API对应的request
            alipayRequest.setBizContent("{" +
                    "\"out_trade_no\":\"" + orderNo + "\"," +        //	商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
                    "\"scene\":\"bar_code\"," +
                    "\"auth_code\":\"" + authCode + "\"," +
                    "\"product_code\":\"FACE_TO_FACE_PAYMENT\"," +
                    "\"subject\":\"" + subject + "\"," +
                    "\"total_amount\":\"" + moneys + "\"," +
                    "  }");//填充业务参数
            AlipayTradePayResponse response = alipayClient.execute(alipayRequest);
            String form = response.getBody();
            if (response.isSuccess()) {
                System.out.println("调用成功");
                log.info("调用成功");
                BigDecimal totalMoney = new BigDecimal(response.getTotalAmount());
                //更新订单
                orders.setPayState("0");
                orders.setActualPayment(totalMoney);
                //查出订单内的商品
                List<ProductInOrders> productInOrdersList = productInOrdersMapper.selectProductInorders(
                        orders.getSupermarketId(), orders.getId());
                //查出商品信息
                List<Product> productList = productMapper.selectProductByIdList(productInOrdersList);
                List<Product> relaProductList = new ArrayList<>();
                for (ProductInOrders productInOrders : productInOrdersList) {
                    for (Product product : productList) {
                        //如果未关联装箱
                        if ("1".equals(product.getRelateOrNot())) {
                            product.setStock(product.getStock() - productInOrders.getNum());
                        }
                        //如果关联装箱
                        if ("0".equals(product.getRelateOrNot())) {
                            //查出所关联的单品
                            Product relaProduct = productMapper.selectById(product.getRelationId());
                            relaProduct.setStock(relaProduct.getStock() - (relaProduct.getRelateNum() * productInOrders.getNum()));
                            relaProductList.add(relaProduct);
                        }
                    }
    
                }
                productList.addAll(relaProductList);
    
                try {
                    iOrdersService.updateById(orders);
                    productMapper.updateProductByList(productList);
                } catch (Exception e) {
                    e.printStackTrace();
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    return ResponseMessage.error("支付成功,更新数据库失败!");
                }
                log.info("支付宝免密支付成功!");
                return ResponseMessage.ok(2, "支付成功");
            } else {
                System.out.println("调用失败");
                log.info("调用失败");
                return ResponseMessage.error("调用失败");
    
            }
        }
    
        /**
         * 支付宝扫码支付
         *
         * @param json
         * @param httpRequest
         * @return
         */
        @Override
        public ResponseMessage<Object> doPost2(String json, HttpServletRequest httpRequest) throws AlipayApiException {
            //商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
            String orderNo = JSON.parseObject(json).getString("orderNo");
    //        //	支付授权码,25~30开头的长度为16~24位的数字,实际字符串长度以开发者获取的付款码长度为准
    //        String authCode = JSON.parseObject(json).getString("authCode");
            //订单标题
            String subject = JSON.parseObject(json).getString("subject");
            if (FavoritesHelper.isNull(orderNo) || FavoritesHelper.isNull(subject)) {
                return ResponseMessage.error(ResultConstants.RESULT_NULL);
            }
            Site site = iSiteService.selectById(siteID);
            String appId = site.getAppId();
            String publicKey = site.getAliPublicKey();
            String privateKey = site.getAliPrivateKey();
            Orders orders = iOrdersService.selectById(orderNo);
            if (null == orders) {
                return ResponseMessage.error("未查询到该订单,请重试!");
            }
            BigDecimal moneys = orders.getSalesAmount();
            AlipayClient alipayClient = new DefaultAlipayClient(URL, appId, privateKey, FORMAT, CHARSET, publicKey, SIGNTYPE); //获得初始化的AlipayClient
            AlipayTradePrecreateRequest alipayRequest = new AlipayTradePrecreateRequest();//创建API对应的request
            alipayRequest.setNotifyUrl(notify_url);
            alipayRequest.setBizContent("{" +
                    "\"out_trade_no\":\"" + orderNo + "\"," +        //	商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
                    "\"subject\":\"" + subject + "\"," +
                    "\"total_amount\":\"" + moneys + "\"," +
                    "  }");//填充业务参数
            AlipayTradePrecreateResponse response = alipayClient.execute(alipayRequest);
            if (response.isSuccess()) {
                System.out.println("调用成功");
                return ResponseMessage.ok(response.getQrCode());
            } else {
                System.out.println("调用失败");
                return ResponseMessage.error("请求失败!");
            }
        }
    
    
        /**
         * 回调
         * 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
         * 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
         * 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),
         * 4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。
         * 在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
         * 在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
         *
         * @param request
         * @return
         */
        @Override
        public String getNotify(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
            Site site = iSiteService.selectById(siteID);
            String appId = site.getAppId();
            String publicKey = site.getAliPublicKey();
            Map<String, String> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
            String paramsJson = JSON.toJSONString(params);
            log.info("支付宝回调,{}", paramsJson);
            try {
                boolean signVerified = AlipaySignature.rsaCheckV1(params, publicKey, CHARSET, SIGNTYPE);
                if (signVerified) {
                    // 按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success,校验失败返回failure
                    String outTradeNo = params.get("out_trade_no");
                    // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
                    Orders orders = iOrdersService.selectById(outTradeNo);
                    //判断订单是否存在
                    if (orders == null) {
                        return "failure";
                    }
                    //判断是否已更改过数据库
                    if ("0".equals(orders.getPayState())){
                        return "success";
                    }
                    BigDecimal amout = new BigDecimal(params.get("total_amount"));
                    //判断金额是否正确
                    if (0!=amout.compareTo(orders.getSalesAmount())){
                        return "failure";
                    }
                    if (!params.get("app_id").equals(appId)) {
                        return "failure";
                    }
                    //更新订单
                    orders.setPayState("0");
                    orders.setActualPayment(amout);
                    //查出订单内的商品
                    List<ProductInOrders> productInOrdersList = productInOrdersMapper.selectProductInorders(
                            orders.getSupermarketId(), orders.getId());
                    //查出商品信息
                    List<Product> productList = productMapper.selectProductByIdList(productInOrdersList);
                    List<Product> relaProductList = new ArrayList<>();
                    for (ProductInOrders productInOrders : productInOrdersList) {
                        for (Product product : productList) {
                            //如果未关联装箱
                            if ("1".equals(product.getRelateOrNot())) {
                                product.setStock(product.getStock() - productInOrders.getNum());
                            }
                            //如果关联装箱
                            if ("0".equals(product.getRelateOrNot())) {
                                //查出所关联的单品
                                Product relaProduct = productMapper.selectById(product.getRelationId());
                                relaProduct.setStock(relaProduct.getStock() - (relaProduct.getRelateNum() * productInOrders.getNum()));
                                relaProductList.add(relaProduct);
                            }
                        }
    
                    }
                    productList.addAll(relaProductList);
                    try {
                        iOrdersService.updateById(orders);
                        productMapper.updateProductByList(productList);
                    }catch (Exception e){
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return "failure";
                    }
                    return "success";
                }
            } catch (AlipayApiException e) {
                e.printStackTrace();
            }
            return "failure";
        }
    
        /**
         * 刷脸支付初始化
         * @param json
         * @return
         */
        @Override
        public ResponseMessage<Object> doPost3(String json,HttpServletRequest httpRequest) throws AlipayApiException {
    
            return null;
        }
    
    
    
    
    
        // 将request中的参数转换成Map
        private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
            Map<String, String> retMap = new HashMap<String, String>();
    
            Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
    
            for (Map.Entry<String, String[]> entry : entrySet) {
                String name = entry.getKey();
                String[] values = entry.getValue();
                int valLen = values.length;
    
                if (valLen == 1) {
                    retMap.put(name, values[0]);
                } else if (valLen > 1) {
                    StringBuilder sb = new StringBuilder();
                    for (String val : values) {
                        sb.append(",").append(val);
                    }
                    retMap.put(name, sb.toString().substring(1));
                } else {
                    retMap.put(name, "");
                }
            }
    
            return retMap;
        }
    
    
    }
    
    
    
    
    展开全文
  • java对接支付宝支付

    2020-10-27 10:52:15
    本文会介绍下使用java对接支付宝支付的前期准备工作以及支付宝官方提供的SDK运行过程 首先登录支付宝开放平台 点击这里,登录之后,点击左下角研发服务 之后会显示这个页面 接下来处理有关密钥的问题,首先下载...
  • Java对接支付宝支付接口 概述支付宝应用开发模式沙箱环境与正式环境 概述     当今互联网时代,第三方支付已经是一个生活中不可或缺的工具,而在众多第三方支付产品中,支付宝无疑是其中最重要的接口之一。 ...
  • 我已经在线上测试成功了,里边有PHP和App对接支付宝的代码,签名,回调,注意事项
  • PythonPython开发Python语言Python对接支付宝支付自实现 Python对接支付宝支付自实现# -*- coding: utf-8 -*-import base64import jsonimport urllib.parsefrom datetime import datetimeimport requestsfrom ...
  • 现在就来实现Django对接支付宝支付功能吧! 登录支付宝开放平台 点击进入蚂蚁金服开放平台https://open.alipay.com/platform/home.htm 进入支付宝沙箱环境...
  • 该项目使用django对接支付宝网站支付接口 前期准备 1. APPID 2. 支付宝公钥-应用公钥-应用私钥 3. 安装支付宝平台python SDK pip install python-alipay-sdk --upgrade (非官方) 调用支付接口 一般支付流程为: ...
  • java 对接支付宝支付

    2018-03-19 13:56:22
    对接支付宝支付的前提: 1,商户开通支付能力 登录蚂蚁金服 开放平台:https://open.alipay.com/platform/home.htm 需要开通 的功能选项有: 创建应用,类型是:网页&amp;移动应用 设置应用的RSA 等各项参数,...
  • 对接支付宝支付的前提:1,商户开通支付能力 需要开通 的功能选项有: 创建应用,类型是:网页&移动应用设置应用的RSA 等各项参数,界面如下: 支付宝推荐使用RSA2 加密方式,老版的加密方式只有RSA 和md5,没有RSA2.本...
  • 支付宝对接支付-JAVA版

    千次阅读 2020-09-09 17:06:10
    本文使用SpringBoot+SpringMVC对接支付宝电脑网站支付接口。将详细讲解开发步骤及一些常见问题。
  • javaWeb对接支付宝 以及 连连支付 两家第三方支付网站
  • 对接支付接口

    2018-06-12 10:07:53
    对接支付宝支付接口开发详细步骤
  • PHP版本对接支付宝支付接口 其实理顺了思路后,...
  • 今天因为业务需要线上支付充值,所以需要对接支付宝的网站支付接口。首先去支付宝开发者中心看了一遍demo;网址如下:https://docs.open.alipay.com/270/106291/ 大致理清了对接接口所需要的一些主要参数; 1,appid...
  • 之前在项目中使用过支付宝的沙箱测试支付和实际开发支付,是关于App对接支付宝接口的,由于前段时间有朋友询问怎么对接网页支付,通过研究支付包的开发文档,在这里总结一下对接支付宝的App支付接口和网页支付接口的...
  • PHP对接支付宝支付接口

    千次阅读 2019-04-02 21:05:03
    PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,接下来跟我走吧~ 一、下载SDK开发工具包 点击链接下载SDK&Demo 我下载的...
  • 网站对接支付宝进行支付

    万次阅读 2017-05-12 14:11:44
    本文介绍PC网页对接支付宝,完成批量向支付宝账户转账的功能(使用Java实现),首先我的水平是这样的:接到这个工作任务后,可以说我是大白,之前我做过银行的项目,懂签名和验签是怎么一回事,但是对接支付宝,我是...
  • 主要介绍了springboot对接支付宝支付接口(详细开发步骤总结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 对接支付宝接口

    2019-07-28 19:33:31
    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧。 第一步:(先要在支付宝进行操做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,315
精华内容 1,726
关键字:

对接支付