使用支付宝沙箱实现扫码支付

准备

注册支付宝,进入开放平台的沙箱环境,接入当面付功能。

期间需要设置支付宝公钥、应用公钥、应用私钥等,具体这些操作我就不多说了,可以自找资料。

当面付

《支付宝当面付文档》

这里写图片描述

下载Demo,然后进行测试。

zfbinfo.properties中主要配置这几项:

# 支付宝网关名、partnerId和appId
# 正式环境
# open_api_domain = https://openapi.alipay.com/gateway.do
# 沙箱环境
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
# 支付宝控制台查看appid,必填
pid = 
appid = 

# RSA私钥、公钥和支付宝公钥,必填
private_key = 
public_key = 

#SHA1withRsa对应支付宝公钥
#alipay_public_key = 

#SHA256withRsa对应支付宝公钥,必填
alipay_public_key = 

查询返回数据

返回AlipayF2FQueryResult,里面包含TradeStatusAlipayTradeQueryResponse,以下是AlipayTradeQueryResponse的内容:

{
    "alipay_trade_query_response": {
        "code": "10000",
        "msg": "Success",
        "buyer_logon_id": "noh***@sandbox.com",
        "buyer_pay_amount": "1.00",
        "buyer_user_id": "2088102176549131",
        "buyer_user_type": "PRIVATE",
        "fund_bill_list": [{
            "amount": "1.00",
            "fund_channel": "ALIPAYACCOUNT"
        }],
        "invoice_amount": "1.00",
        "out_trade_no": "48758867",
        "point_amount": "0.00",
        "receipt_amount": "1.00",
        "send_pay_date": "2018-08-30 10:44:02",
        "total_amount": "1.00",
        "trade_no": "2018083021001004130500294377",
        "trade_status": "TRADE_SUCCESS"
    },
    "sign": "****签名****"
}

回调数据处理

/**
 * 将回调返回的信息转化为Map
 * @param request
 * @return
 */
public static Map<String, String> transferCallBackResultToMap(HttpServletRequest request){
    Map<String,String> params = new HashMap<String,String>();
    Map<String,String[]> 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] + ",";
        }
        params.put(name, valueStr);
    }
    return params;
}

接口示例

// 根据订单信息生成二维码
@RequestMapping("/getQCode")
public String getQCode(HttpServletRequest request, HttpSession session){...}

// 根据订单号查询
@RequestMapping("/query")
public String query(String outTradeNo, Map<String, Object> map){...}

// 根据订单号和退款参数进行退款
@RequestMapping("/refund")
public String refund(String outTradeNo, String refundAmount, String refundReason, String outRequestNo, String storeId, Map<String, Object> map){...}

// 扫码成功后进行支付宝回调
@PostMapping("/alipay_callback")
@ResponseBody
public String callback(HttpServletRequest request){...}

// 检测支付状态,进行扫码支付后跳转
@GetMapping("/checkPayResult")
@ResponseBody
public Map<String, String> checkPayResult(@RequestParam("outTradeNo") String outTradeNo){...}

测试

使用测试账号以及沙箱版支付宝进行测试。

《开发平台-沙箱环境》

所遇问题

1、支付宝公钥错误

com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail

检查支付宝公钥的加密方式,确保加密方式以及配置正确。

2、gson版本问题

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gsonBuilder' defined in class path resource [org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration.class]:

SpringBoot使用gson,版本问题,更新较新版本即可。

3、扫码支付后回调问题

  • 在发送预支付(即生成二维码)时就设置回调URL,而不是在控制台设置,而且URL不能带有&等特殊符号
  • 回调URL必须暴露在公网上,可使用natapp进行内网穿透
  • 权限拦截问题,阻止了回调
  • 使用POST方式接收
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是使用支付宝沙箱生成收款码的代码实现: ``` python import requests # 支付宝沙箱接口地址 url = "https://openapi.alipaydev.com/gateway.do" # 支付宝沙箱应用的APPID app_id = "你的APPID" # 支付宝沙箱应用的私钥 app_private_key = """ -----BEGIN RSA PRIVATE KEY----- 你的私钥 -----END RSA PRIVATE KEY----- """ # 支付宝沙箱应用的公钥 alipay_public_key = """ -----BEGIN PUBLIC KEY----- 支付宝公钥 -----END PUBLIC KEY----- """ # 构建请求参数 params = { "app_id": app_id, "method": "alipay.marketing.cashlessvoucher.template.create", "format": "JSON", "charset": "utf-8", "sign_type": "RSA2", "timestamp": "2022-01-01 00:00:00", "version": "1.0", "biz_content": { "template_name": "测试收款码", "voucher_type": "cashless", "brand_name": "测试品牌", "voucher_desc": "测试描述", "publish_start_time": "2022-01-01 00:00:00", "publish_end_time": "2023-01-01 00:00:00", "use_rule": { "use_condition": { "suit_shops": { "shop_id": [ "001", "002", "003" ] } } } } } # 生成签名 from urllib.parse import quote_plus from hashlib import sha256 from base64 import encodebytes from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 sign_params = "&".join("{}={}".format(k, quote_plus(str(v))) for k, v in sorted(params.items())) sign_string = "&".join(["POST", quote_plus("/gateway.do"), quote_plus(sign_params)]) sign_key = RSA.import_key(app_private_key) signer = PKCS1_v1_5.new(sign_key) signature = encodebytes(signer.sign(sha256(sign_string.encode("utf-8")))).decode("utf-8").replace("\n", "") # 发送请求 headers = { "Content-Type": "application/json;charset=utf-8", } data = { **params, "sign": signature, } response = requests.post(url, headers=headers, json=data) # 解析响应 import json response_data = json.loads(response.content.decode("utf-8")) qr_code = response_data["alipay_cashless_voucher_template_create_response"]["qr_code"] print(qr_code) ``` 在上面的代码中,我们通过 `alipay.marketing.cashlessvoucher.template.create` 接口创建了一个无需现金支付的优惠券模板,并生成了一个收款码。其中,我们需要将支付宝沙箱应用的APPID、私钥和公钥替换成自己的。 成功执行后,会输出生成的收款码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值