fzlee / alipay

Python Alipay(支付宝) SDK with SHA1/SHA256 support
Other
1.29k stars 378 forks source link

通知验证的django示例代码中(restframework),有处错误 #102

Closed answer0732 closed 4 years ago

answer0732 commented 4 years ago
#django版的

def hello_world(request):
    # for django users
    data = request.dict()
    # for rest_framework users
    data = request.data

    signature = data.pop("sign")

    # verification
    success = alipay.verify(data, signature)
    if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED" ):
        print("trade succeed")
    return 'Hello, World!'

你好,测试了一下午,django版本的通知验证貌似有处需要改正(restframework用户) data = request.data 这个会报错: This QueryDict instance is immutable 官方解释: 在正常的请求/响应周期中访问时,QueryDicts request.POST和request.GET将是不可变的。要获得可变版本,您需要使用QueryDict.copy()。 改成: data = request.data.copy()

另外上面这个还需要转化一下,它是querydict类型,不是dict,直接使用会在verify验证环节报出AliPayException异常(貌似在querydict中是列表形式): None, "Unknown sign type: ['RSA2']

最终改成: data = (request.data.copy()).dict() 示例代码就能正常执行了

answer0732 commented 4 years ago

另外想问下如何能让回调返回自定义参数,比如用户id(我自己的网站用户),我需要知道是谁充值的啊。 在order_string中加入自定义参数,异步回调里面没有反应啊

order_string = alipay.api_alipay_trade_app_pay(
    out_trade_no=xxxxx
    notify_url=xxxxx',
    subject=subject,
    total_amount=total_amount,
    #下面的两个参数,异步回调中没有得到,不知该怎么用
    user_id=1,
    test='hello',
 )
fzlee commented 4 years ago

django应该使用 request.dict()

restframework里面的request.data, 应该不是QueryDict对象,是可以直接修改的.

你可以print(type(request)) 看看这个request是哪一个框架下的class.

自定义参数

你可以参看这个文档 https://docs.open.alipay.com/api_1/alipay.trade.app.pay 使用passback_params

answer0732 commented 4 years ago

十分感谢

yswtrue commented 4 years ago

我也是遇到这个问题,按照楼主的修改就可以了