wkt's blog
非学无以致疑,非问无以广识

有赞下单及回调

admin~2018年10月21日 /flask/其他

有赞提供的用户下单和下单回调接口中

这就会造成无法记住下单用户身份和支付数据很容易伪造的问题.

订单关联用户

下单接口中存在一个看似比较鸡肋的留言(message)可选参数, 在回调接口中会原样返回, 可以试着将用户的身份标志写入其中.

    params = dict()
    params['item_id'] = server_item
    params['kdt_id'] = server_shop_id
    params['num'] = int(ubsnums)  # 后台服务价格和有赞平台价格单价一致
    params['order_type'] = 0
    params['source'] = "redpkg"  # 订单来源'红包'
    score = data['UBSsocre']
    # 订单自定义加密
    ordertoken = self._geniric_secret_msg(score, int(price), out_trade_no)
    params['message'] = '["购买服务", {score}, {time}, "{out_trade_no}", "{secret}"]'.format(score=score, openid=openid, time=int(time.time()), out_trade_no=out_trade_no, secret=ordertoken)
    yz = Youzan()
    files = []
    data = yz.http(url='youzan.trade.bill.good.url.get', method='GET',  params=params, files=files)

防止伪造

同样是在message中(因为也就这一个可以任意编辑), message中的secret为使用服务器secretkey加密的字符串, 在回调接口中接收到原路返回的message再进行解密即可.

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

 @staticmethod
    def _geniric_secret_msg(score, price, ordersn):
        s = Serializer(current_app.config['SECRET_KEY'])
        return s.dumps({
            'score': score,
            'price': price,
            'ordersn': ordersn
        })

在用户下单页面:

        try:
            yz = Youzan(version='4.0.0')
            data = yz.http(url='youzan.trade.get', params=params)
            response = data.get('response')
            full_order_info = response.get('full_order_info')
            orders = full_order_info.get('orders')
            for order in orders:
                buyer_messages = order.get('buyer_messages')
                buyer_messages = json.loads(buyer_messages)  # 这是下单接口中存入的加密数据
                scret_msg = buyer_messages[-1]
                s = Serializer(current_app.config['SECRET_KEY'])
                cleartext = s.loads(scret_msg)
                ordersn = cleartext.get('ordersn')
                score = cleartext.get('score')
            return ordersn, score   # orders是一个列表, 但是在此处并不会有多个
        except ApiError as e:
            raise ApiError('fake message')
        except Exception as e:
            raise e

发表评论

电子邮件地址不会被公开。