Windows 32bit + VS2013 支付宝条码支付

  1. 前言
    支付宝条码支付早在去年上半年已经开发完成,也一直很想写一篇关于这方面的文章,期间换了公司,忙着适应新的工作环境,夹杂着各种私事,以至一拖再拖,现在终于可以趁着春节长假好好梳理一下。

  2. 环境
    Win7 32bit,VS2013。

  3. 开发语言
    C++

  4. 帮助文档
    支付宝提供了很详细的 条码支付在线帮助文档 及相关API与Demo,但仅包含Java/PHP/.NET 3类版本。
    针对接口的任何疑问,可以尝试帮助文档右侧的人工服务,答复非常及时,曾有一次发现晚上10点多仍有客服在线。
    这里写图片描述

  5. 接入规则
    关于条码支付的应用场景与交易入流程等,帮助文档中有较为详细的介绍,此处不再赘述。其中,接口对应用层协议、数据格式与编码等都有着严格限制,具体如下:

    类型说明
    传输方式HTTPS
    提交方式POST
    数据格式返回参数均为 JSON 格式
    字符编码支持 GBK、GB2312、UTF-8 字符编码
    签名算法RSA
  6. 创建应用
    功能开发前,需登陆 支付宝开放平台 申请自己的应用。通常半天之内可收到审批结果。

    这里写图片描述

    注:
    1)应用名词和图标需严格按照规定填写,否则申请可能被驳回。
    2)申请功能选择“当面付”。

  7. 秘钥生成与配置
    1) 下载 OpenSSL-Win32
    2)按照“附录一:私钥公钥生成及范例”,生成 RSA 私钥及公钥。即rsa_public_key.pem、rsa_private_key.pem。对于不清楚私钥与公钥的读者,可具体百度查阅相关资料,此处不再赘述。读者只需知道:当商户向支付宝发送请求时,需使用RSA 私钥对请求参数进行加密;而当支付宝收到请求时,则需使用对应的RSA 公钥对请求参数进行解密。

    这里写图片描述

    保存后,系统将自动创建支付宝公钥。此公钥与RSA公钥作用相反,由商户对支付宝的响应数据进行解密使用。下载支付宝公钥,PEM格式化后,命名为alipay_rsa_public_key.pem。

    这里写图片描述

  8. VS2013中应用
    1)构造支付宝参数列表。参数格式如下:

    { "app_id=所申请应用的APPID&biz_content={\"out_trade_no\":\"20170123203350\",\"scene\":\"bar_code\",\"auth_code\":\"支付宝条码\",\"total_amount\":0.03,\"discountable_amount\":0.01,\"undiscountable_amount\":0.02,\"subject\":\"Park_20170123203350\",\"goods_detail\":[{\"goods_id\":\"apple-01\",\"goods_name\":\"Vehicle_toll\",\"goods_category\":\"7788230\",\"price\":0.01,\"quantity\":1}],\"operator_id\":\"op001\",\"store_id\":\"pudong001\",\"terminal_id\":\"t_001\",\"timeout_express\":\"1m\"}}

    2)利用alipay_rsa_public_key.pem,对请求参数进行签名。
    3)构造请求URL。

    AnsiString requestUrl = "https://openapi.alipay.com/gateway.do?" ;
        requestUrl += "app_id=" + UTF8编码(应用APPID);
        requestUrl += "&biz_content=" + UTF8编码(支付宝参数列表);
        requestUrl += "&charset=" + UTF8编码("GBK");
        requestUrl += "&method="+ UTF8编码("alipay.trade.pay");
        requestUrl += "&sign=" + UTF8编码(签名后的参数列表);
        requestUrl += "&sign_type=" + UTF8编码("RSA");
        requestUrl += "&timestamp=" + UTF8编码(当前时间); 
        requestUrl += "&version=" + UTF8编码("1.0");

    之所以需同时提供签名前和签名后额参数列表,是因为支付宝在利用RSA公钥验签时,需将解签后的参数列表与原始参数列表进行对比,以判断参数是否非法纂改。
    4)解析响应数据。响应数据中的 “alipay_trade_pay_response”部分即为我们所关心的数据。

    {
    "alipay_trade_pay_response": {
    "code": "10000",
    "msg": "订单支付成功",
    "trade_no": "2013112011001004330000121536",
    "out_trade_no": "6823789339978248",
    "open_id": "2088102122524333",
    "buyer_logon_id": "159****5620",
    "total_amount": "88.88",
    "receipt_amount": "8.88",
    "gmt_payment": "2014-11-27 15:45:57",
    },
    "sign": "jfAz0Yi0OUvAPqYTzA0DLysx0ri++yf7o/lkHOHaG1Zy2fHBf3j4WM\n+sJWHZUuyInt6V+wn+6IP9AmwRTKi+GGdWjPrsfBjXqR7H5aBnLhMsAltV7v4cYjhug\nuAqh4WkaJO6v6CfdybDpzHlxE6Thoucnad+OsjdCXkNd1g3UuU=\n"
    }

    5)RSA的验签。
    从alipay_trade_pay_response中提取大括号内所有参数(包括大括号)以及sign参数的值,然后利用支付宝公钥进行验签。同时,根据参数“code”的值,可判断支付是否成功。

    结果码含义说明
    10000业务处理成功
    40004业务处理失败具体失败原因参见接口返回的错误码
    10003业务处理中该结果码只有在条码支付请求 API 时才返回,代表付款还在进行中,需要调用查询接口查询最终的支付结果
    20000业务出现未知错误或者系统异常业务出现未知错误或者系统异常,如果支付接口返回,需要调用查询接口确认订单状态或者发起撤销
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值