首先给大家推荐一个好用的微信支付封装包:
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)
如有不正之处还请提出,感谢!!!