前言
支付宝条码支付早在去年上半年已经开发完成,也一直很想写一篇关于这方面的文章,期间换了公司,忙着适应新的工作环境,夹杂着各种私事,以至一拖再拖,现在终于可以趁着春节长假好好梳理一下。环境
Win7 32bit,VS2013。开发语言
C++帮助文档
支付宝提供了很详细的 条码支付在线帮助文档 及相关API与Demo,但仅包含Java/PHP/.NET 3类版本。
针对接口的任何疑问,可以尝试帮助文档右侧的人工服务,答复非常及时,曾有一次发现晚上10点多仍有客服在线。
接入规则
关于条码支付的应用场景与交易入流程等,帮助文档中有较为详细的介绍,此处不再赘述。其中,接口对应用层协议、数据格式与编码等都有着严格限制,具体如下:类型 说明 传输方式 HTTPS 提交方式 POST 数据格式 返回参数均为 JSON 格式 字符编码 支持 GBK、GB2312、UTF-8 字符编码 签名算法 RSA 创建应用
功能开发前,需登陆 支付宝开放平台 申请自己的应用。通常半天之内可收到审批结果。注:
1)应用名词和图标需严格按照规定填写,否则申请可能被驳回。
2)申请功能选择“当面付”。秘钥生成与配置
1) 下载 OpenSSL-Win32。
2)按照“附录一:私钥公钥生成及范例”,生成 RSA 私钥及公钥。即rsa_public_key.pem、rsa_private_key.pem。对于不清楚私钥与公钥的读者,可具体百度查阅相关资料,此处不再赘述。读者只需知道:当商户向支付宝发送请求时,需使用RSA 私钥对请求参数进行加密;而当支付宝收到请求时,则需使用对应的RSA 公钥对请求参数进行解密。保存后,系统将自动创建支付宝公钥。此公钥与RSA公钥作用相反,由商户对支付宝的响应数据进行解密使用。下载支付宝公钥,PEM格式化后,命名为alipay_rsa_public_key.pem。
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 += "×tamp=" + 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 业务出现未知错误或者系统异常 业务出现未知错误或者系统异常,如果支付接口返回,需要调用查询接口确认订单状态或者发起撤销
Windows 32bit + VS2013 支付宝条码支付
最新推荐文章于 2023-02-15 22:11:05 发布