python pc端微信扫码支付

 

首先给大家推荐一个好用的微信支付封装包:
https://wechatpy.readthedocs.io/zh_CN/master/pay.html



# 一、定义路由:
#发起微信支付
url('ic/order/(?P<order_id>.+)/payment/', views_front.PaymentView.as_view()),
# 订单确认,更改订单状态
url('ic/order/(?P<order_id>.+)/validation/', views_front.WechatOrderQuery.as_view()),
from math import floor
from datetime import datetime, timedelta
from wechatpy.utils import timezone
class PaymentView(APIView):
"""微信支付"""

  permission_classes = [IsAuthenticated]

  def get(self, request, order_id):
    try:
      order = OrderInfo.objects.get(order_id=order_id,
      pay_method=OrderInfo.PAY_METHODS_ENUM['WEXIN'],
      status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
    except OrderInfo.DoesNotExist:
      return Response({'message': '订单信息有误'},status=status.HTTP_400_BAD_REQUEST)
    wechatpay = WeChatPay(
      appid=settings.APPID,
      api_key=settings.API_KEY,
      mch_id=settings.MCH_ID,
      mch_cert=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_cert.pem"),
      mch_key=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_key.pem"),
      timeout=300,
      )
 
    total_fee = floor(order.total_amount * 100)
    now = datetime.fromtimestamp(time.time(), tz=timezone('Asia/Shanghai'))
    hours_later = now + timedelta(seconds=60)
    pay_data = wechatpay.order.create(
    trade_type="NATIVE",
    body='百度%s' % order_id,
    total_fee=total_fee,
    notify_url='http://www.mason.natapp1.cc/ic/pc/wechatpay',
    out_trade_no="NATIVE" + order_id,
    product_id=1,
    time_expire=hours_later
    )
    qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.ERROR_CORRECT_H,
    box_size=10,
    border=1,
    )
    qr.add_data(pay_data['code_url'])
    qr.make(fit=True)
    image = qr.make_image()
    out = BytesIO()
    image.save(out, format='JPEG')
    qr_image = out.getvalue()
    return HttpResponse(qr_image, content_type="images/jpg")



class WechatOrderQuery(APIView):
  """订单确认"""
  permission_classes = [IsAuthenticated]
  def get(self, request, order_id):
    wechatpay = WeChatPay(
    appid=settings.APPID,
    api_key=settings.API_KEY,
    mch_id=settings.MCH_ID,
    mch_cert=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_cert.pem"),
    mch_key=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_key.pem"),
    timeout=300
    )
    pay_data = wechatpay.order.query(out_trade_no="NATIVE" + order_id)
    if pay_data['trade_state'] == 'SUCCESS':
      OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
      order = OrderInfo.objects.get(order_id=order_id)
      return Response({'message': '支付成功', "order_id": order_id},status=status.HTTP_200_OK)
    elif pay_data['trade_state'] == 'NOPAY':
      return Response({'message': '未支付'}, status=status.HTTP_204_NO_CONTENT)
    else:
      return Response({'message': '其他错误'}, status=status.HTTP_204_NO_CONTENT)
 
如有不正之处还请提出,感谢!!!
首先给大家推荐一个好用的微信支付封装包:
https://wechatpy.readthedocs.io/zh_CN/master/pay.html



# 一、定义路由:
#发起微信支付
url('ic/order/(?P<order_id>.+)/payment/', views_front.PaymentView.as_view()),
# 订单确认,更改订单状态
url('ic/order/(?P<order_id>.+)/validation/', views_front.WechatOrderQuery.as_view()),
from math import floor
from datetime import datetime, timedelta
from wechatpy.utils import timezone
class PaymentView(APIView):
"""微信支付"""

  permission_classes = [IsAuthenticated]

扫描二维码关注公众号,回复: 8595920 查看本文章
  def get(self, request, order_id):
    try:
      order = OrderInfo.objects.get(order_id=order_id,
      pay_method=OrderInfo.PAY_METHODS_ENUM['WEXIN'],
      status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
    except OrderInfo.DoesNotExist:
      return Response({'message': '订单信息有误'},status=status.HTTP_400_BAD_REQUEST)
    wechatpay = WeChatPay(
      appid=settings.APPID,
      api_key=settings.API_KEY,
      mch_id=settings.MCH_ID,
      mch_cert=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_cert.pem"),
      mch_key=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_key.pem"),
      timeout=300,
      )
 
    total_fee = floor(order.total_amount * 100)
    now = datetime.fromtimestamp(time.time(), tz=timezone('Asia/Shanghai'))
    hours_later = now + timedelta(seconds=60)
    pay_data = wechatpay.order.create(
    trade_type="NATIVE",
    body='百度%s' % order_id,
    total_fee=total_fee,
    notify_url='http://www.mason.natapp1.cc/ic/pc/wechatpay',
    out_trade_no="NATIVE" + order_id,
    product_id=1,
    time_expire=hours_later
    )
    qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.ERROR_CORRECT_H,
    box_size=10,
    border=1,
    )
    qr.add_data(pay_data['code_url'])
    qr.make(fit=True)
    image = qr.make_image()
    out = BytesIO()
    image.save(out, format='JPEG')
    qr_image = out.getvalue()
    return HttpResponse(qr_image, content_type="images/jpg")



class WechatOrderQuery(APIView):
  """订单确认"""
  permission_classes = [IsAuthenticated]
  def get(self, request, order_id):
    wechatpay = WeChatPay(
    appid=settings.APPID,
    api_key=settings.API_KEY,
    mch_id=settings.MCH_ID,
    mch_cert=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_cert.pem"),
    mch_key=os.path.join(os.path.dirname(os.path.abspath(__file__)), "../keys/apiclient_key.pem"),
    timeout=300
    )
    pay_data = wechatpay.order.query(out_trade_no="NATIVE" + order_id)
    if pay_data['trade_state'] == 'SUCCESS':
      OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
      order = OrderInfo.objects.get(order_id=order_id)
      return Response({'message': '支付成功', "order_id": order_id},status=status.HTTP_200_OK)
    elif pay_data['trade_state'] == 'NOPAY':
      return Response({'message': '未支付'}, status=status.HTTP_204_NO_CONTENT)
    else:
      return Response({'message': '其他错误'}, status=status.HTTP_204_NO_CONTENT)
 
如有不正之处还请提出,感谢!!!

猜你喜欢

转载自www.cnblogs.com/xiaohu1139168758/p/12192515.html
今日推荐