Hello everyone,
Thank you for reading this !
I am a 3 weeks newbie in django. I occurred a picklingerror when 
integrating qrcode payment(wechat payment) with django-oscar.
*Steps cause the promblem:*


   1.     Add a product in basket and chose to pay directly;
   2.     Chose payment method;
   3.     Jump to preview page and press the “place order” button on 
   it(which by normally will jump to scan code page which has a qrcode on it);


*Error message:*
it works well before, but since tomorrow it display picklingerror like this:
PicklingError at /zh-cn/checkout/preview/
Can't pickle <type 'function'>: attribute lookup __builtin__.function failed




*Traceback:*

Environment:
Request Method: POST
Request URL: http://xiwen.proxy.qqbrowser.cc:8000/zh-cn/checkout/preview/

Django Version: 1.8.5
Python Version: 2.7.10
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.admin',
 'django.contrib.flatpages',
 'django.contrib.staticfiles',
 'django.contrib.sitemaps',
 'django_extensions',
 'debug_toolbar',
 'apps.gateway',
 'widget_tweaks',
 'wcpay',
 'oscar',
 'oscar.apps.analytics',
 'apps.checkout',
 'oscar.apps.address',
 'oscar.apps.shipping',
 'oscar.apps.catalogue',
 'oscar.apps.catalogue.reviews',
 'oscar.apps.partner',
 'oscar.apps.basket',
 'oscar.apps.payment',
 'oscar.apps.offer',
 'oscar.apps.order',
 'oscar.apps.customer',
 'oscar.apps.promotions',
 'oscar.apps.search',
 'oscar.apps.voucher',
 'oscar.apps.wishlists',
 'oscar.apps.dashboard',
 'oscar.apps.dashboard.reports',
 'oscar.apps.dashboard.users',
 'oscar.apps.dashboard.orders',
 'oscar.apps.dashboard.promotions',
 'oscar.apps.dashboard.catalogue',
 'oscar.apps.dashboard.offers',
 'oscar.apps.dashboard.partners',
 'oscar.apps.dashboard.pages',
 'oscar.apps.dashboard.ranges',
 'oscar.apps.dashboard.reviews',
 'oscar.apps.dashboard.vouchers',
 'oscar.apps.dashboard.communications',
 'oscar.apps.dashboard.shipping',
 'haystack',
 'treebeard',
 'sorl.thumbnail',
 'django_tables2']
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'oscar.apps.basket.middleware.BasketMiddleware')


Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in 
get_response
  223.                 response = middleware_method(request, response)
File 
"/Library/Python/2.7/site-packages/django/contrib/sessions/middleware.py" in 
process_response
  50.                         request.session.save()
File 
"/Library/Python/2.7/site-packages/django/contrib/sessions/backends/db.py" 
in save
  59.             session_data=self.encode(self._get_session(no_load=
must_create)),
File 
"/Library/Python/2.7/site-packages/django/contrib/sessions/backends/base.py" 
in encode
  88.         serialized = self.serializer().dumps(session_dict)
File 
"/Library/Python/2.7/site-packages/django/contrib/sessions/serializers.py" 
in dumps
  15.         return pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)

Exception Type: PicklingError at /zh-cn/checkout/preview/
Exception Value: Can't pickle <type 'function'>: attribute lookup 
__builtin__.function failed





*Debug info:*
i debugged and found this problem is threw from handler/base.py.
By the way, i didn’t remember i have change any code which cause this 
problem.

try:
            # Apply response middleware, regardless of the response         
 
 for middleware_method in self._response_middleware:
                response = middleware_method(request, response)
                # Complain if the response middleware returned None (a 
common error).
                if response is None:
                    raise ValueError(
                        "%s.process_response didn't return an "
                        "HttpResponse object. It returned None instead."
                        % (middleware_method.__self__.__class__.__name__))
            response = self.apply_response_fixes(request, response)
        except:  # Any exception should be gathered and handled
            signals.got_request_exception.send(sender=self.__class__, 
request=request)
            response = self.handle_uncaught_exception(request, resolver, sys
.exc_info())



*Part of my code:*


   -     mysite/app/checkout/views.py


class MultiPaymentDetailsView(RedirectSessionMixin, OscarPaymentDetailsView
):
    template_name = 'checkout/payment_details.html'
    template_name_preview = 'checkout/preview.html'
    paymentsource_name={
        'WeChatPay':"微信担保",
        }
    paymentsource_method={
        'WeChatPay':WechatpayHandle
    }

    def get_context_data(self, **kwargs):
        context=super(OscarPaymentDetailsView,self).get_context_data(**
kwargs)
        context['paymethod']=self.paymentsource_name[self.get_paymethod()]
        return context

    def get(self, request, *args, **kwargs):
        if kwargs.get('paymethod'):
            self.save_paymethod(kwargs.get('paymethod'))
            return HttpResponseRedirect('/checkout/preview')
        return super(OscarPaymentDetailsView,self).get(self,request, *args, 
**kwargs)


    def handle_payment(self, order_number, total, **kwargs):
        """
        Make submission to scancode
        """
        self.set_order_number(order_number)
        self.set_info()
        paymethod=self.paymentsource_method[self.get_paymethod()]
        paymethod(self,order_number, **kwargs)





   -     mysite/wcpay/views.py


def WechatpayHandle(paymentview,order_number, **kwargs):
    """
    Make submission to Wechat
    """
    wechatpaymon=WechatpaySessionMixin(paymentview.checkout_session)
    if settings.DEBUG:
        base_url = 'http://%s' % paymentview.request.META['HTTP_HOST']
    else:
        base_url = 'https://%s' % Site.objects.get_current().domain

    # 向微信服务器发送统一下单请求|send place order request to weixin server
    # notify_url = '
http://8d9ce024.ngrok.io/zh-cn/checkout/wechatpay/respond'
    notify_url = "%s%s" % (base_url, reverse("checkout:wcpay:wechat-respond"
))
    print 'notify_url: ',notify_url
    comm = Common_util_pub()
    out_trade_no = '{0}{1}{2}'.format('scan','_',int(time.time()))
    out_trade_no = '{0}{1}'.format(out_trade_no,comm.createNoncestr(32 - len
(out_trade_no)))
    unifiedpay = UnifiedOrder_pub()
    unifiedpay.setParameter('out_trade_no', out_trade_no)
    unifiedpay.setParameter('body', '扫一扫支付')
    unifiedpay.setParameter('total_fee', '1')
    unifiedpay.setParameter('notify_url', notify_url)
    unifiedpay.setParameter('trade_type', 'NATIVE')
    unifiedorder = unifiedpay.getPrepayId()

    start_pay_url = '/zh-cn/checkout/wechatpay/scancode'
    code_url = unifiedorder.get('code_url')
    # start_pay_url = '/checkout/wechatpay/scancode'
    # rp = requests.post(start_pay_url1, json.dumps(code_url))
    # print rp
    start_pay_url = start_pay_url + '/?code_url=' + code_url
    # wechatpaymon.set_wechatpay()
    raise RedirectRequired(start_pay_url)






*Reference:*
https://github.com/amyhoo/django-oscar-alipay
a good project which didn’t implement qrcode scan but quite the same way.

Any ideas about this problem or materials about how to develop qrcode 
payment with django will be grateful !
 


Thanks!
Xiwen

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/7f4d577f-9f8a-4daf-a7f2-65c5fb9ba1c3%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to