irst 8 lat temu escape.js 11e3a9652a first 8 lat temu escapeRegExp.js 11e3a9652a first 8 lat temu every.js 11e3a9652a first 8 lat temu extend.js 11e3a9652a first 8 lat temu extendAll.js 11e3a9652a first 8 lat temu extendAllWith.js 11e3a9652a first 8 lat temu extendWith.js 11e3a9652a first 8 lat temu fill.js 11e3a9652a first 8 lat temu filter.js 11e3a9652a first 8 lat temu find.js 11e3a9652a first 8 lat temu findFrom.js 11e3a9652a first 8 lat temu findIndex.js 11e3a9652a first 8 lat temu findIndexFrom.js 11e3a9652a first 8 lat temu findKey.js 11e3a9652a first 8 lat temu findLast.js 11e3a9652a first 8 lat temu findLastFrom.js 11e3a9652a first 8 lat temu findLastIndex.js 11e3a9652a first 8 lat temu findLastIndexFrom.js 11e3a9652a first 8 lat temu findLastKey.js 11e3a9652a first 8 lat temu first.js 11e3a9652a first 8 lat temu flatMap.js 11e3a9652a first 8 lat temu flatMapDeep.js 11e3a9652a first 8 lat temu flatMapDepth.js 11e3a9652a first 8 lat temu flatten.js 11e3a9652a first 8 lat temu flattenDeep.js 11e3a9652a first 8 lat temu flattenDepth.js 11e3a9652a first 8 lat temu flip.js 11e3a9652a first 8 lat temu floor.js 11e3a9652a first 8 lat temu flow.js 11e3a9652a first 8 lat temu flowRight.js 11e3a9652a first 8 lat temu forEach.js 11e3a9652a first 8 lat temu forEachRight.js 11e3a9652a first 8 lat temu forIn.js 11e3a9652a first 8 lat temu forInRight.js 11e3a9652a first 8 lat temu forOwn.js 11e3a9652a first 8 lat temu forOwnRight.js 11e3a9652a first 8 lat temu fromPairs.js 11e3a9652a first 8 lat temu function.js 11e3a9652a first 8 lat temu functions.js 11e3a9652a first 8 lat temu functionsIn.js 11e3a9652a first 8 lat temu get.js 11e3a9652a first 8 lat temu getOr.js 11e3a9652a first 8 lat temu groupBy.js 11e3a9652a first 8 lat temu gt.js 11e3a9652a first 8 lat temu gte.js 11e3a9652a first 8 lat temu has.js 11e3a9652a first 8 lat temu hasIn.js 11e3a9652a first 8 lat temu head.js 11e3a9652a first 8 lat temu identical.js 11e3a9652a first 8 lat temu identity.js 11e3a9652a first 8 lat temu inRange.js 11e3a9652a first 8 lat temu includes.js 11e3a9652a first 8 lat temu includesFrom.js 11e3a9652a first 8 lat temu indexBy.js 11e3a9652a first 8 lat temu indexOf.js 11e3a9652a first 8 lat temu indexOfFrom.js 11e3a9652a first 8 lat temu init.js 11e3a9652a first 8 lat temu initial.js 11e3a9652a first 8 lat temu intersection.js 11e3a9652a first 8 lat temu intersectionBy.js 11e3a9652a first 8 lat temu intersectionWith.js 11e3a9652a first 8 lat temu invert.js 11e3a9652a first 8 lat temu invertBy.js 11e3a9652a first 8 lat temu invertObj.js 11e3a9652a first 8 lat temu invoke.js 11e3a9652a first 8 lat temu invokeArgs.js 11e3a9652a first 8 lat temu invokeArgsMap.js 11e3a9652a first 8 lat temu invokeMap.js 11e3a9652a first 8 lat temu isArguments.js 11e3a9652a first 8 lat temu isArray.js 11e3a9652a first 8 lat temu isArrayBuffer.js 11e3a9652a first 8 lat temu isArrayLike.js 11e3a9652a first 8 lat temu isArrayLikeObject.js 11e3a9652a first 8 lat temu isBoolean.js 11e3a9652a first 8 lat temu isBuffer.js 11e3a9652a first 8 lat temu isDate.js 11e3a9652a first 8 lat temu isElement.js 11e3a9652a first 8 lat temu isEmpty.js 11e3a9652a first 8 lat temu isEqual.js 11e3a9652a first 8 lat temu isEqualWith.js 11e3a9652a first 8 lat temu isError.js 11e3a9652a first 8 lat temu isFinite.js 11e3a9652a first 8 lat temu isFunction.js 11e3a9652a first 8 lat temu isInteger.js 11e3a9652a first 8 lat temu isLength.js 11e3a9652a first 8 lat temu isMap.js 11e3a9652a first 8 lat temu isMatch.js 11e3a9652a first 8 lat temu isMatchWith.js 11e3a9652a first 8 lat temu isNaN.js 11e3a9652a first 8 lat temu isNative.js 11e3a9652a first 8 lat temu isNil.js 11e3a9652a first 8 lat temu isNull.js 11e3a9652a first 8 lat temu isNumber.js 11e3a9652a first 8 lat temu isObject.js 11e3a9652a first 8 lat temu isObjectLike.js 11e3a9652a first 8 lat temu isPlainObject.js 11e3a9652a first 8 lat temu isRegExp.js 11e3a9652a first 8 lat temu isSafeInteger.js 11e3a9652a first 8 lat temu isSet.js 11e3a9652a first 8 lat temu isString.js 11e3a9652a first 8 lat temu isSymbol.js 11e3a9652a first 8 lat temu isTypedArray.js 11e3a9652a first 8 lat temu isUndefined.js 11e3a9652a first 8 lat temu isWeakMap.js 11e3a9652a first 8 lat temu isWeakSet.js 11e3a9652a first 8 lat temu iteratee.js 11e3a9652a first 8 lat temu join.js 11e3a9652a first 8 lat temu juxt.js 11e3a9652a first 8 lat temu kebabCase.js 11e3a9652a first 8 lat temu keyBy.js 11e3a9652a first 8 lat temu keys.js 11e3a9652a first 8 lat temu keysIn.js 11e3a9652a first 8 lat temu lang.js 11e3a9652a first 8 lat temu last.js 11e3a9652a first 8 lat temu lastIndexOf.js 11e3a9652a first 8 lat temu lastIndexOfFrom.js 11e3a9652a first 8 lat temu lowerCase.js 11e3a9652a first 8 lat temu lowerFirst.js 11e3a9652a first 8 lat temu lt.js 11e3a9652a first 8 lat temu lte.js 11e3a9652a first 8 lat temu map.js 11e3a9652a first 8 lat temu mapKeys.js 11e3a9652a first 8 lat temu mapValues.js 11e3a9652a first 8 lat temu matches.js 11e3a9652a first 8 lat temu matchesProperty.js 11e3a9652a first 8 lat temu math.js 11e3a9652a first 8 lat temu max.js 11e3a9652a first 8 lat temu maxBy.js 11e3a9652a first 8 lat temu mean.js 11e3a9652a first 8 lat temu meanBy.js 11e3a9652a first 8 lat temu memoize.js 11e3a9652a first 8 lat temu merge.js 11e3a9652a first 8 lat temu mergeAll.js 11e3a9652a first 8 lat temu mergeAllWith.js 11e3a9652a first 8 lat temu mergeWith.js 11e3a9652a first 8 lat temu method.js 11e3a9652a first 8 lat temu methodOf.js 11e3a9652a first 8 lat temu min.js 11e3a9652a first 8 lat temu minBy.js 11e3a9652a first 8 lat temu mixin.js 11e3a9652a first 8 lat temu multiply.js 11e3a9652a first 8 lat temu nAry.js 11e3a9652a first 8 lat temu negate.js 11e3a9652a first 8 lat temu next.js 11e3a9652a first 8 lat temu noop.js 11e3a9652a first 8 lat temu now.js 11e3a9652a first 8 lat temu nth.js 11e3a9652a first 8 lat temu nthArg.js 11e3a9652a first 8 lat temu number.js 11e3a9652a first 8 lat temu object.js 11e3a9652a first 8 lat temu omit.js 11e3a9652a first 8 lat temu omitAll.js 11e3a9652a first 8 lat temu omitBy.js 11e3a9652a first 8 lat temu once.js 11e3a9652a first 8 lat temu orderBy.js 11e3a9652a first 8 lat temu over.js 11e3a9652a first 8 lat temu overArgs.js 11e3a9652a first 8 lat temu overEvery.js 11e3a9652a first 8 lat temu overSome.js 11e3a9652a first 8 lat temu pad.js 11e3a9652a first 8 lat temu padChars.js 11e3a9652a first 8 lat temu padCharsEnd.js 11e3a9652a first 8 lat temu padCharsStart.js 11e3a9652a first 8 lat temu padEnd.js 11e3a9652a first 8 lat temu padStart.js 11e3a9652a first 8 lat temu parseInt.js 11e3a9652a first 8 lat temu partial.js 11e3a9652a first 8 lat temu partialRight.js 11e3a9652a first 8 lat temu partition.js 11e3a9652a first 8 lat temu path.js 11e3a9652a first 8 lat temu pathEq.js 11e3a9652a first 8 lat temu pathOr.js 11e3a9652a first 8 lat temu paths.js 11e3a9652a first 8 lat temu pick.js 11e3a9652a first 8 lat temu pickAll.js 11e3a9652a first 8 lat temu pickBy.js 11e3a9652a first 8 lat temu pipe.js 11e3a9652a first 8 lat temu placeholder.js 11e3a9652a first 8 lat temu plant.js 11e3a9652a first 8 lat temu pluck.js 11e3a9652a first 8 lat temu prop.js 11e3a9652a first 8 lat temu propEq.js 11e3a9652a first 8 lat temu propOr.js 11e3a9652a first 8 lat temu property.js 11e3a9652a first 8 lat temu propertyOf.js 11e3a9652a first 8 lat temu props.js 11e3a9652a first 8 lat temu pull.js 11e3a9652a first 8 lat temu pullAll.js 11e3a9652a first 8 lat temu pullAllBy.js 11e3a9652a first 8 lat temu pullAllWith.js 11e3a9652a first 8 lat temu pullAt.js 11e3a9652a first 8 lat temu random.js 11e3a9652a first 8 lat temu range.js 11e3a9652a first 8 lat temu rangeRight.js 11e3a9652a first 8 lat temu rangeStep.js 11e3a9652a first 8 lat temu rangeStepRight.js 11e3a9652a first 8 lat temu rearg.js 11e3a9652a first 8 lat temu reduce.js 11e3a9652a first 8 lat temu reduceRight.js 11e3a9652a first 8 lat temu reject.js 11e3a9652a first 8 lat temu remove.js 11e3a9652a first 8 lat temu repeat.js 11e3a9652a first 8 lat temu replace.js 11e3a9652a first 8 lat temu rest.js 11e3a9652a first 8 lat temu restFrom.js 11e3a9652a first 8 lat temu result.js 11e3a9652a first 8 lat temu reverse.js 11e3a9652a first 8 lat temu round.js 11e3a9652a first 8 lat temu sample.js 11e3a9652a first 8 lat temu sampleSize.js 11e3a9652a first 8 lat temu seq.js 11e3a9652a first 8 lat temu set.js 11e3a9652a first 8 lat temu setWith.js 11e3a9652a first 8 lat temu shuffle.js 11e3a9652a first 8 lat temu size.js 11e3a9652a first 8 lat temu slice.js 11e3a9652a first 8 lat temu snakeCase.js 11e3a9652a first 8 lat temu some.js 11e3a9652a first 8 lat temu sortBy.js 11e3a9652a first 8 lat temu sortedIndex.js 11e3a9652a first 8 lat temu sortedIndexBy.js 11e3a9652a first 8 lat temu sortedIndexOf.js 11e3a9652a first 8 lat temu sortedLastIndex.js 11e3a9652a first 8 lat temu sortedLastIndexBy.js 11e3a9652a first 8 lat temu sortedLastIndexOf.js 11e3a9652a first 8 lat temu sortedUniq.js 11e3a9652a first 8 lat temu sortedUniqBy.js 11e3a9652a first 8 lat temu split.js 11e3a9652a first 8 lat temu spread.js 11e3a9652a first 8 lat temu spreadFrom.js 11e3a9652a first 8 lat temu startCase.js 11e3a9652a first 8 lat temu startsWith.js 11e3a9652a first 8 lat temu string.js 11e3a9652a first 8 lat temu stubArray.js 11e3a9652a first 8 lat temu stubFalse.js 11e3a9652a first 8 lat temu stubObject.js 11e3a9652a first 8 lat temu stubString.js 11e3a9652a first 8 lat temu stubTrue.js 11e3a9652a first 8 lat temu subtract.js 11e3a9652a first 8 lat temu sum.js 11e3a9652a first 8 lat temu sumBy.js 11e3a9652a first 8 lat temu symmetricDifference.js 11e3a9652a first 8 lat temu symmetricDifferenceBy.js 11e3a9652a first 8 lat temu symmetricDifferenceWith.js 11e3a9652a first 8 lat temu tail.js 11e3a9652a first 8 lat temu take.js 11e3a9652a first 8 lat temu takeLast.js 11e3a9652a first 8 lat temu takeLastWhile.js 11e3a9652a first 8 lat temu takeRight.js 11e3a9652a first 8 lat temu takeRightWhile.js 11e3a9652a first 8 lat temu takeWhile.js 11e3a9652a first 8 lat temu tap.js 11e3a9652a first 8 lat temu template.js 11e3a9652a first 8 lat temu templateSettings.js 11e3a9652a first 8 lat temu throttle.js 11e3a9652a first 8 lat temu thru.js 11e3a9652a first 8 lat temu times.js 11e3a9652a first 8 lat temu toArray.js 11e3a9652a first 8 lat temu toFinite.js 11e3a9652a first 8 lat temu toInteger.js 11e3a9652a first 8 lat temu toIterator.js 11e3a9652a first 8 lat temu toJSON.js 11e3a9652a first 8 lat temu toLength.js 11e3a9652a first 8 lat temu toLower.js 11e3a9652a first 8 lat temu toNumber.js 11e3a9652a first 8 lat temu toPairs.js 11e3a9652a first 8 lat temu toPairsIn.js 11e3a9652a first 8 lat temu toPath.js 11e3a9652a first 8 lat temu toPlainObject.js 11e3a9652a first 8 lat temu toSafeInteger.js 11e3a9652a first 8 lat temu toString.js 11e3a9652a first 8 lat temu toUpper.js 11e3a9652a first 8 lat temu transform.js 11e3a9652a first 8 lat temu trim.js 11e3a9652a first 8 lat temu trimChars.js 11e3a9652a first 8 lat temu trimCharsEnd.js 11e3a9652a first 8 lat temu trimCharsStart.js 11e3a9652a first 8 lat temu trimEnd.js 11e3a9652a first 8 lat temu trimStart.js 11e3a9652a first 8 lat temu truncate.js 11e3a9652a first 8 lat temu unapply.js 11e3a9652a first 8 lat temu unary.js 11e3a9652a first 8 lat temu unescape.js 11e3a9652a first 8 lat temu union.js 11e3a9652a first 8 lat temu unionBy.js 11e3a9652a first 8 lat temu unionWith.js 11e3a9652a first 8 lat temu uniq.js 11e3a9652a first 8 lat temu uniqBy.js 11e3a9652a first 8 lat temu uniqWith.js 11e3a9652a first 8 lat temu uniqueId.js 11e3a9652a first 8 lat temu unnest.js 11e3a9652a first 8 lat temu unset.js 11e3a9652a first 8 lat temu unzip.js 11e3a9652a first 8 lat temu unzipWith.js 11e3a9652a first 8 lat temu update.js 11e3a9652a first 8 lat temu updateWith.js 11e3a9652a first 8 lat temu upperCase.js 11e3a9652a first 8 lat temu upperFirst.js 11e3a9652a first 8 lat temu useWith.js 11e3a9652a first 8 lat temu util.js 11e3a9652a first 8 lat temu value.js 11e3a9652a first 8 lat temu valueOf.js 11e3a9652a first 8 lat temu values.js 11e3a9652a first 8 lat temu valuesIn.js 11e3a9652a first 8 lat temu where.js 11e3a9652a first 8 lat temu whereEq.js 11e3a9652a first 8 lat temu without.js 11e3a9652a first 8 lat temu words.js 11e3a9652a first 8 lat temu wrap.js 11e3a9652a first 8 lat temu wrapperAt.js 11e3a9652a first 8 lat temu wrapperChain.js 11e3a9652a first 8 lat temu wrapperLodash.js 11e3a9652a first 8 lat temu wrapperReverse.js 11e3a9652a first 8 lat temu wrapperValue.js 11e3a9652a first 8 lat temu xor.js 11e3a9652a first 8 lat temu xorBy.js 11e3a9652a first 8 lat temu xorWith.js 11e3a9652a first 8 lat temu zip.js 11e3a9652a first 8 lat temu zipAll.js 11e3a9652a first 8 lat temu zipObj.js 11e3a9652a first 8 lat temu zipObject.js 11e3a9652a first 8 lat temu zipObjectDeep.js 11e3a9652a first 8 lat temu zipWith.js 11e3a9652a first 8 lat temu kodo - Gogs: Go Git Service

Nav apraksta

views.py 12KB

    # -*- coding: utf-8 -*- import xmltodict from django.conf import settings from django.db import transaction from django.shortcuts import HttpResponse from logit import logit from TimeConvert import TimeConvert as tc from wechatpy import WeChatPay, WeChatPayException from account.models import UserIncomeExpensesInfo, UserInfo from group.models import GroupPhotoInfo, GroupPhotoOrderInfo from pay.models import OrderInfo from photo.models import PhotosInfo from utils.error.errno_utils import (GroupPhotoStatusCode, OrderStatusCode, UserStatusCode, WechatStatusCode, WithdrawStatusCode) from utils.error.response_utils import response from utils.page_utils import pagination from utils.redis.rbrief import set_brief_info from utils.redis.rorder import set_lensman_order_record r = settings.REDIS_CACHE WECHAT = settings.WECHAT @logit @transaction.atomic def wx_order_create_api(request): """ 订单创建 :param request: :return: """ group_id = request.POST.get('group_id', '') user_id = request.POST.get('user_id', '') photo_id = request.POST.get('photo_id', '') photo_type = request.POST.get('photo_type', 'nomark') # nomark for 去除水印, origin for 获取高清图 photo_type_ = OrderInfo.ORIGIN if photo_type == 'origin' else OrderInfo.NOMARK # 群组照片校验 try: group_photo = GroupPhotoInfo.objects.get(pk=photo_id) except GroupPhotoInfo.DoesNotExist: return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND) # 判断是否重复购买 if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_, from_uid=user_id, pay_status=OrderInfo.PAID).exists(): return response(OrderStatusCode.WX_ORDER_PAID_ALREADY_EXISTS) body = request.POST.get('body', '') # 商品描述 total_fee = int(request.POST.get('total_fee', 0)) # 总金额,单位分 # 金额校验 # if int(r.get(LENSMAN_PHOTO_PRICE % (user_id, photo_id, photo_type)) or 0) != total_fee: # return response(OrderStatusCode.FEE_CHECK_FAIL) # 获取 from_uid, to_uid from_uid = user_id to_uid = group_photo.lensman_id or group_photo.user_id # JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里 trade_type = request.POST.get('trade_type', '') # 根据 trade_type 获取 wechat 配置 wechat = WECHAT.get(trade_type, {}) # WeChatPay 初始化 wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID')) # 生成订单 order = OrderInfo.objects.create( group_id=group_id, photo_id=photo_id, lensman_photo_id=group_photo.lensman_photo_id, photo_type=1 if photo_type == 'origin' else 0, from_uid=from_uid, to_uid=to_uid, session_id=group_photo.session_id, total_fee=total_fee, trade_type=trade_type, ) try: prepay_data = wxpay.order.create( body=body, notify_url=settings.API_DOMAIN + '/wx/notify_url', out_trade_no=order.order_id, total_fee=total_fee, trade_type=trade_type, # user_id=None, # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传 ) except WeChatPayException: return response(OrderStatusCode.WX_UNIFIED_ORDER_FAIL) prepay_id = prepay_data.get('prepay_id', '') if trade_type == 'JSAPI': wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id) elif trade_type == 'APP': wxpay_params = wxpay.order.get_appapi_params(prepay_id) return response(200, 'Order Create Success', u'订单创建成功', { 'order_id': order.order_id, 'prepay_id': prepay_id, 'wxpay_params': wxpay_params, }) def order_paid_success(order): if order.pay_status == OrderInfo.PAID: return if order.photo_type == OrderInfo.NOMARK: order.photo_status = OrderInfo.FETCHED order.pay_status = OrderInfo.PAID order.paid_at = tc.utc_datetime() order.save() porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create( group_id=order.group_id, session_id=order.session_id, user_id=order.from_uid, photo_id=order.photo_id, lensman_photo_id=order.lensman_photo_id, ) photo = PhotosInfo.objects.get( photo_id=order.lensman_photo_id, ) if order.photo_type == OrderInfo.NOMARK: porder.m_photo_path = photo.m_photo_path elif order.photo_type == OrderInfo.ORIGIN: porder.r_photo_path = photo.r_photo_path porder.save() set_lensman_order_record(porder) to_uid = order.to_uid total_fee = order.total_fee try: user = UserInfo.objects.select_for_update().get(user_id=to_uid) except UserInfo.DoesNotExist: return if order.photo_type == OrderInfo.NOMARK: # 余额增加 amount, freeze_income_amount = total_fee, 0 user.balance += amount # Redis 数值更新 set_brief_info(to_uid, order.photo_type, total_fee) # 余额记录 UserIncomeExpensesInfo.objects.create( user_id=to_uid, photo_id=order.photo_id, type=UserIncomeExpensesInfo.INCOME, amount=amount, balance=user.balance, freeze_income_amount=freeze_income_amount, freeze_income_balance=user.freeze_income_balance, remark=u'图片购买', ) elif order.photo_type == OrderInfo.ORIGIN: amount, freeze_income_amount = 0, total_fee user.freeze_income_balance += freeze_income_amount user.save() def order_paid_fail(order): if order.pay_status == OrderInfo.FAIL: return order.pay_status = OrderInfo.FAIL order.save() @logit @transaction.atomic def wx_order_query_api(request): """ 订单查询 :param request: :return: """ order_id = request.POST.get('order_id', '') transaction_id = request.POST.get('transaction_id', '') try: order = OrderInfo.objects.select_for_update().get(order_id=order_id) except OrderInfo.DoesNotExist: return response(OrderStatusCode.WX_ORDER_NOT_FOUND) if order.pay_status == OrderInfo.PAID: return response(200, 'Order Pay Success', u'订单支付成功') elif order.pay_status == OrderInfo.FAIL: return response(OrderStatusCode.WX_ORDER_PAY_FAIL) # 根据 trade_type 获取 wechat 配置 wechat = WECHAT.get(order.trade_type, {}) # WeChatPay 初始化 wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID')) # 订单查询 query_data = wxpay.order.query(transaction_id, order_id) # 签名校验 if not wxpay.check_signature(query_data): return response(OrderStatusCode.SIGN_CHECK_FAIL) # 交易状态 trade_state = query_data.get('trade_state') # 订单状态判断更新 if trade_state == 'SUCCESS': # 订单支付成功 order_paid_success(order) return response(200, 'Order Pay Success', u'订单支付成功') elif trade_state == 'NOTPAY': # 订单未支付 return response(OrderStatusCode.WX_ORDER_NOT_PAY) elif trade_state == 'USERPAYING': # 订单支付中 return response(OrderStatusCode.WX_ORDER_PAYING) else: # 订单支付失败 order_paid_fail(order) return response(OrderStatusCode.WX_ORDER_PAY_FAIL) @logit @transaction.atomic def wx_order_list_api(request): """ 订单列表 :param request: :return: """ user_id = request.POST.get('user_id', '') page = int(request.POST.get('page', 1)) num = int(request.POST.get('num', settings.ORDER_NUM_PER_PAGE)) orders = OrderInfo.objects.filter(from_uid=user_id, pay_status=OrderInfo.PAID, status=True).order_by('-pk') orders, left = pagination(orders, page, num) orders = [order.data(user_id) for order in orders] return response(200, 'Get Order List Success', u'获取订单列表成功', { 'orders': orders, 'left': left, }) @logit @transaction.atomic def wx_order_detail_api(request): """ 订单详情 :param request: :return: """ user_id = request.POST.get('user_id', '') order_id = request.POST.get('order_id', '') try: order = OrderInfo.objects.get(order_id=order_id) except OrderInfo.DoesNotExist: return response(OrderStatusCode.WX_ORDER_NOT_FOUND) if user_id not in [order.from_uid, order.to_uid]: return response(OrderStatusCode.NO_DETAIL_PERMISSION) return response(200, 'Get Order Detail Success', u'获取订单详情成功') @logit @transaction.atomic def wx_notify_url_api(request): """ 支付异步通知回调地址 :param request: :return: """ try: data = xmltodict.parse(request.body)['xml'] except xmltodict.ParsingInterrupted: # 解析 XML 失败 return HttpResponse(settings.WXPAY_NOTIFY_FAIL) trade_type = data.get('trade_type', '') # 根据 trade_type 获取 wechat 配置 wechat = WECHAT.get(trade_type, {}) # WeChatPay 初始化 wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID')) # 签名校验 if not wxpay.check_signature(data): return response(OrderStatusCode.SIGN_CHECK_FAIL) out_trade_no = data.get('out_trade_no', '') return_code = data.get('return_code', '') result_code = data.get('result_code', '') if return_code != 'SUCCESS' or result_code != 'SUCCESS': return HttpResponse(settings.WXPAY_NOTIFY_FAIL) try: order = OrderInfo.objects.get(order_id=out_trade_no) except OrderInfo.DoesNotExist: return response(OrderStatusCode.WX_ORDER_NOT_FOUND) order_paid_success(order) return HttpResponse(settings.WXPAY_NOTIFY_SUCCESS) @logit @transaction.atomic def wx_balance_withdraw_api(request): user_id = request.POST.get('user_id', '') # 用户校验 try: user = UserInfo.objects.select_for_update().get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里 trade_type = request.POST.get('trade_type', '') # TRANSFER--企业付款、PACKET--现金红包, 余额提现接口withdraw_type的传参可参考这里 withdraw_type = request.POST.get('withdraw_type', 'TRANSFER') amount = int(request.POST.get('amount', 0)) if not user.openid: return response(WechatStatusCode.OPENID_NOT_FOUND) if user.balance < amount: return response(WithdrawStatusCode.BALANCE_NOT_ENOUGH) # 根据 trade_type 获取 wechat 配置 wechat = WECHAT.get(trade_type, {}) # WeChatPay 初始化 wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID'), mch_cert=wechat.get('mch_cert'), mch_key=wechat.get('mch_key')) if withdraw_type == 'TRANSFER': ret_data = wxpay.transfer.transfer(user.openid, amount, u'摄影师余额提现,企业付款', check_name='NO_CHECK') elif withdraw_type == 'PACKET': ret_data = wxpay.redpack.send( user.openid, amount, send_name=wechat.get('redpacket', {}).get('SEND_NAME'), nick_name=wechat.get('redpacket', {}).get('NICK_NAME'), act_name=wechat.get('redpacket', {}).get('ACT_NAME'), wishing=wechat.get('redpacket', {}).get('WISHING'), remark=wechat.get('redpacket', {}).get('REMARK'), ) # 根据 ret_data 判断是否提现成功, 成功则减余额, 失败则提示 user.balance -= amount user.save() return response(200, 'Withdraw Success', u'提现成功', {})