def get_payment_params(self, payment_params): if settings.DEBUG: debug = True elif settings.STAGE: debug = True else: debug = False alipay = AliPay( debug=debug, appid=resources.get_alipay_app_id(), app_notify_url=urlmapper.get_url('ALIPAY_CALLBACK_URL'), app_private_key_path=resources.get_viastelle_pri_key(), alipay_public_key_path=resources.get_viastelle_pub_key(), sign_type="RSA2" ) payment_order = alipay.api_alipay_trade_app_pay( out_trade_no=payment_params['order_id'], total_amount=payment_params['total_price'], subject=payment_params['product_title'], ) self.logger_info.info(payment_order) param_result = {'alipay_order': payment_order} return param_result
class AliPayJzz(object): def __init__(self): self.ali_pay = AliPay( appid=app_id, app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, alipay_public_key_string=ali_pay_public_key_string, sign_type="RSA2", debug=False # 默认False ) def pc_pay(self, out_trade_no, total_amount, subject, return_url, notify_url): """ :param out_trade_no: 订单号 :param total_amount: 金额 :param subject: 商品描述 :param return_url: 回跳的url :param notify_url: 返回通知 :return: order_string or none """ try: order_string = self.ali_pay.api_alipay_trade_page_pay( out_trade_no=out_trade_no, total_amount=total_amount, subject=subject # return_url=None # notify_url=notify_url ) except Exception as e: print("pc_pay_error %s" % str(e)) return None return order_string def app_pay(self, out_trade_no, total_amount, subject, notify_url): try: order_string = self.ali_pay.api_alipay_trade_app_pay( out_trade_no=out_trade_no, total_amount=total_amount, subject=subject, notify_url=notify_url) except Exception as e: print("app_pay_error %s" % str(e)) return None return order_string def verify_pay_result(self, data, signature): """ :param data: ali pay return data :param signature: data.pop("sign") :return: "trade succeed" or none """ try: result = self.ali_pay.verify(data, signature) except Exception as e: print("verify_pay_result_error %s:" % str(e)) return None if result and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"): return "trade succeed"
class AliAppPayment: """ 支付宝app支付功能 """ def __init__(self): self.app_private_key_string = open("./private_key.txt").read() self.ali_public_key_string = open("./public_key.txt").read() self.alipay = AliPay( appid="2019042664373131", # 商户appid app_notify_url=None, # 默认回调url # 支付宝私钥 app_private_key_string=self.app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=self.ali_public_key_string, sign_type="RSA2", debug=False) def get_order_string(self, out_trade_no, t_amount, subject): order_string = self.alipay.api_alipay_trade_app_pay( out_trade_no=str(out_trade_no), total_amount=str(t_amount), subject=subject, # 部署时,修改该url为http+本机外网ip或域名 # notify_url="http://106.14.127.164:8080/amount/deposit/return" notify_url="http://106.14.127.164:5000/pay/alipayment_notify") return order_string
def create_recharge(money=10): """创建充值订单""" current_user_id = get_jwt_identity() user = User.query.get(current_user_id) if user is None: return { "errno": status.CODE_NO_USER, "errmsg": message.user_not_exists, } order_number = datetime.now().strftime( "%y%m%d%H%M%S") + "%08d" % user.id + "%04d" % random.randint(0, 9999) print(order_number) recharge = Recharge(status=False, out_trade_number=order_number, name="账号充值-%s元" % money, user_id=user.id, money=money) db.session.add(recharge) db.session.commit() # 创建支付宝sdk对象 app_private_key_string = open( os.path.join( current_app.BASE_DIR, "application/apps/users/keys/app_private_key.pem")).read() alipay_public_key_string = open( os.path.join(current_app.BASE_DIR, "application/apps/users/keys/app_public_key.pem")).read() alipay = AliPay( appid=current_app.config.get("ALIPAY_APP_ID"), app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type=current_app.config.get("ALIPAY_SIGN_TYPE"), debug=False, # 默认False config=AliPayConfig(timeout=15) # 可选, 请求超时时间 ) order_string = alipay.api_alipay_trade_app_pay( out_trade_no=recharge.out_trade_number, # 订单号 total_amount=float(recharge.money), # 订单金额 subject=recharge.name, # 订单标题 notify_url=current_app.config.get( "ALIPAY_NOTIFY_URL") # 服务端的地址,自定义一个视图函数给alipay ) return { "errno": status.CODE_OK, "errmsg": message.ok, "sandbox": current_app.config.get("ALIPAY_SANDBOX"), "order_string": order_string, "order_number": recharge.out_trade_number, }
def get(self): order_id = request.args.get('order_id') # 构建支付 alipay_client = AliPay( appid=ALIPAY_APPID, # 默认回调 app_notify_url=None, app_private_key_string=APP_PRIVATE_KEY, alipay_public_key_string=APP_PUBLIC_KEY, sign_type='RSA', debug=False) subject = 'I20 系列 30核 ' # 电脑网站支付,跳转:https://openapi.alipay.com/gateway.do? + order_string order_string = alipay_client.api_alipay_trade_app_pay( out_trade_no='1100000', total_amount='10000', subject=subject, return_url='https://github.com/sajinchang', notify_url='https://github.com/sajinchang' #可选 ) # 手机网站支付 # order_string = alipay_client.api_alipay_trade_wap_pay( # out_trade_no = '1100000', # total_amount = '10000', # subject = subject, # return_url = 'https://github.com/sajinchang', # notify_url = 'https://github.com/sajincahng' # # ) # 客户端支付 pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string data = { 'msg': 'ok', 'status': 200, 'data': { 'pay_url': pay_url, 'order_id': order_id } } return data
def get(self, request, order_id): #1.接受订单id user = request.user #2.根据订单id查询订单 try: #为了查询的准确性,我们尽量多家几个条件 order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except OrderInfo.DoesNotExist: return Response(status=status.HTTP_400_BAD_REQUEST) #3.生成alipay实力对象 app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH) alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH) alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, #默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA 或者 RSA2 debug=settings.ALIPAY_DEBUG # 默认False ) #4.调用支付接口生成order_string subject = '测试订单' # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_app_pay( out_trade_no=order_id, total_amount=str( order.total_amount), # total_amount是 decimal类型 要转换为 str subject=subject, return_url="http://www.meiduo.site:8080/pay_success.html", # notify_url="https://example.com/notify" # 可选, 不填则使用默认notify url) ) #5.拼接url alipay_url = settings.ALIPAY_URL + '?' + order_string #6.返回url return Response({'alipay_url': alipay_url})
def get(self, request, order_id): # 构建跳转链接 try: order = OrderInfo.objects.get(order_id=order_id) except: return JsonResponse({'error': '订单不存在'}, status=400) path = os.path.join(settings.BASE_DIR, 'apps/payments/keys/app_private_key.pem') # 初始话支付对象 alipay = AliPay( # 支付宝应用中心id appid=settings.ALIPAY_APPID, # 默认url app_notify_url=None, # 没多四要 app_private_key_path=os.path.join( settings.BASE_DIR, 'apps/payments/keys/app_private_key.pem'), # 支付宝公钥 alipay_public_key_path=os.path.join( settings.BASE_DIR, 'apps/payments/keys/alipay_public_key.pem'), # 加密算法 sign_type="RSA2", debug=settings.ALIPAY_DEBUG) # 构建网址中的查询字符串 order_string = alipay.api_alipay_trade_app_pay( # 制定当前的订单编号 out_trade_no=order_id, # 制定订单的金额 total_amount=str(order.total_amount), # 标题 subject='美多商城-%s' % order_id, # 支付成的跳转链接 return_url=settings.ALIPAY_RETURN_URL, # 支付成功后跳转美多连接地址 ) alipay_url = settings.ALIPAY_URL + order_string return JsonResponse({'alipay_url': alipay_url, 'code': 0})
class AlipayBase(object): def __init__(self, isVip=None): # print(AliPay_alipay_private_key) # # # print(AliPay_alipay_public_key) # # print(AliPay_Appid) self.alipay = AliPay( appid=AliPay_Appid, app_notify_url=Alipay_callbackUrl if not isVip else Alipay_callbackUrlForVip, app_private_key_string=AliPay_app_private_key, alipay_public_key_string=AliPay_alipay_public_key, sign_type="RSA2", debug=False, # 上线则改为False , 沙箱True ) def query(self, orderid): response = self.alipay.api_alipay_trade_query(out_trade_no=orderid) return response def create(self, order_id, amount, subject=None): order_string = self.alipay.api_alipay_trade_app_pay( out_trade_no=order_id, total_amount=str(amount.quantize(Decimal('0.00'))), subject='支付订单:%s' % order_id if not subject else subject, return_url=None, notify_url=None, ) logger.info(order_string) return order_string def refund(self, order, orderid, refund_amount): response = self.alipay.api_alipay_trade_refund(refund_amount=str( refund_amount.quantize(Decimal('0.00'))), out_trade_no=orderid) logger.info("退款信息->{}".format(response)) if response['code'] != '10000': raise PubErrorCustom(response['msg']) try: for item in OrderGoodsLink.objects.filter( linkid__in=json.loads(order.linkid)['linkids']): try: glObj = GoodsLinkSku.objects.select_for_update().get( id=item.skugoodslinkid) glObj.stock += item.gdnum glObj.number -= item.gdnum glObj.save() except GoodsLinkSku.DoesNotExist: pass except Exception as e: print(str(e)) def callback_vip(self, data): iData = dict() for item in data: iData[item] = data[item] sign = iData.pop("sign", None) if not self.alipay.verify(iData, sign): print(iData) raise PubErrorCustom("验签失败!") if iData.get("trade_status", None) != 'TRADE_SUCCESS': print(iData) raise PubErrorCustom("交易状态异常!") try: orderObj = OrderVip.objects.select_for_update().get( orderid=iData.get("out_trade_no", "")) if orderObj.status == '1': logger.info("订单{}已处理".format(orderObj.orderid)) raise PubErrorCustom("订单{}已处理".format(orderObj.orderid)) except Order.DoesNotExist: raise PubErrorCustom("订单不存在!") orderObj.status = '1' user = Users.objects.select_for_update().get(userid=orderObj.userid) if user.isvip == '1': user.exprise = viphandler(user.exprise, orderObj.unit, orderObj.term) orderObj.exprise = user.exprise else: user.isvip = '1' user.term = orderObj.term user.unit = orderObj.unit user.exprise = orderObj.exprise orderObj.save() user.save() def callback(self, data): iData = dict() for item in data: iData[item] = data[item] sign = iData.pop("sign", None) if not self.alipay.verify(iData, sign): print(iData) raise PubErrorCustom("验签失败!") if iData.get("trade_status", None) != 'TRADE_SUCCESS': print(iData) raise PubErrorCustom("交易状态异常!") try: orderObj = Order.objects.select_for_update().get( orderid=iData.get("out_trade_no", "")) if orderObj.status == '1': logger.info("订单{}已处理".format(orderObj.orderid)) raise PubErrorCustom("订单{}已处理".format(orderObj.orderid)) except Order.DoesNotExist: raise PubErrorCustom("订单不存在!") orderObj.status = '1' orderObj.trade_no = iData['trade_no'] orderObj.trade_info = json.dumps(iData, ensure_ascii=False) orderObj.save() user = Users.objects.select_for_update().get(userid=orderObj.userid) logger.info("用户{}积分余额{}使用积分{}获得积分{}".format(user.mobile, user.jf, orderObj.use_jf, orderObj.get_jf)) user.jf -= orderObj.use_jf user.jf += orderObj.get_jf user.save() logger.info("支付宝回调订单处理成功!=>{}".format(iData))
def post(self, request): # 接受参数 serializer = OrderInfoSerializer(data=request.data) if not serializer.is_valid(): return response_400(serializer.errors) pay_method = serializer.validated_data.get('pay_method') payee = serializer.validated_data.get('payee') amount = serializer.validated_data.get('amount') pay_item_class = serializer.validated_data.get('pay_item_class') pay_item_id = serializer.validated_data.get('pay_item_id') # try: # order = OrderInfo.objects.get(order_id=order_id, user=user, pay_method=2, order_status=1) # except OrderInfo.DoesNotExist: # return JsonResponse({"res": 2, 'errmas': '订单错误'}) # 业务处理:使用sdk调用支付宝的支付接口 # 初始化 app_private_key_string = open( os.path.join(settings.BASE_DIR, "app_private_key.pem")).read() alipay_public_key_string = open( os.path.join(settings.BASE_DIR, "alipay_public_key.pem")).read() alipay = AliPay( appid="2019080766140322", app_notify_url=SITE_DOMAIN + '/api/order/alipay_notifiy/', # app_notify_url=None, # app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/blog/app_private_key.pem'), app_private_key_string=app_private_key_string, # alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/blog/alipay_public_key.pem'), alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", debug=False # 不是调试模式,访问实际环境地址 # debug=True # 沙箱开发环境 ) user = request.user order_no = datetime.now().strftime('%Y%m%d%H%M%S') + str(user.id) OrderInfo.objects.create(order_no=order_no, pay_item_id=pay_item_id, user=user, payee=payee, pay_method=pay_method, amount=decimal.Decimal(amount), pay_item_class=pay_item_class, trade_status='WAIT_BUYER_PAY') # 调用支付宝接口 # App支付,将order_string返回给app即可 order_string = alipay.api_alipay_trade_app_pay( out_trade_no=order_no, # 订单id total_amount=str(amount), subject='艺起评%s' % order_no, ) # # 手机网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string # order_string = alipay.api_alipay_trade_wap_pay( # out_trade_no=order_id, #订单id # total_amount=0.01, # subject='app 名%s'%order_id, # return_url=None, # notify_url=None, # 可选, 不填则使用默认notify url # ) # 返回应答 # pay_url = 'https://openapi.alipay.com/gateway.do?' + order_string # 沙箱 # pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string order_string = json.dumps({ "order_string": order_string, "order_no": order_no }) return HttpResponse(order_string)
#!/usr/bin/env python # encoding: utf-8 ''' @author: qiuyan @contact: [email protected] @file: demo_alipay.py @time: 2019/8/26 6:04 PM @desc: ''' #支付宝初始化 from alipay import AliPay app_private_key_string = open("alipay/private_key_2048.txt").read() alipay_public_key_string = open("alipay/alipay_pub_key").read() _alipay = AliPay( appid="2019082666427588", app_notify_url="http://api.ytodanhao.com.cn/alipay/notify", # app_private_key_path="pay_key/private_2048.txt", # alipay_public_key_path="pay_key/public_2048.txt" app_private_key_string=app_private_key_string, alipay_public_key_string=alipay_public_key_string) order_string = _alipay.api_alipay_trade_app_pay(out_trade_no='2019082618092', total_amount=100, subject='厨房电器勺子') print(order_string)