微信批量退款php,微信退款 - 飞儿飞的个人空间 - OSCHINA - 中文开源技术交流社区...

refund_url:'https://api.mch.weixin.qq.com/secapi/pay/refund' 退款url

import pycurl

import optparse

class RefundHandler(BaseHandler):

allowed_methods = ('POST')

fields = ()

model = RefundInfo

def read(self, request, *args, **kwargs):

return 'read'

def create(self, request, *args, **kwargs):

out_trade_no = str(request.POST.get('out_trade_no'))

appid = int(request.POST.get('app',0))

log.debug(out_trade_no)

data = get_object_or_404(WxNotify,out_trade_no = out_trade_no)

params = {}

params['appid'] = data.appid

params['mch_id'] = data.mch_id

params['nonce_str'] = data.nonce_str

params['transaction_id'] = data.transaction_id

params['out_trade_no'] =data.out_trade_no

params['out_refund_no'] = str(RindomStr(16))

params['total_fee'] = data.total_fee

params['refund_fee'] = data.total_fee

params['op_user_id'] = data.mch_id

# params['sign'] = get_sign(params)

thirdinfo_paths = thirdinfo_path(appid)

xml = get_xml(params,thirdinfo_paths.APIKEY)

# headers = {'Content-Type': 'application/xml'}

# r = requests.post(refund_url, data=xml, headers=headers)

# log.debug(r.content)

r = postXmlSSL(xml,refund_url,thirdinfo_paths.SSLCERT_PATH,thirdinfo_paths.SSLKEY_PATH,second=30,cert=True,post=True)

log.debug(r)

options = optparse.Values({"pretty": False})

jsonstr = json.loads(xml2json(r,options))['xml']

# convertedDict = xmltodict.parse(r)

# log.debug(convertedDict)

# jsonStr = json.dumps(convertedDict)

# jsonstr = jsonStr.replace('\\','')

try:

data = request.POST.copy()

data.update(jsonstr)

log.debug(data)

f = RefundInfoForm(data,request=request)

if f.is_valid():

f.save()

else:

raise FormValidationError(f)

except:

log.debug(jsonstr)

if jsonstr['result_code'] == 'SUCCESS':

pay_order = PayOrder.objects.all().filter(order_id=out_trade_no)

##########################################################################

#如果type为退货,则修改退货状态为完成,同时更新退货完成时间,payorder的状态不修改

type = request.POST.get('type','')

if type == 'salesreturn':

refundstatus = get_object_or_404(RefundStatus,payorder=pay_order)

refundstatus.status = 'complete'

refundstatus.f_time = datetime.datetime.now()

refundstatus.save()

return jsonstr

##########################################################################

pay_order.update(status="closed")

return jsonstr

def postXmlSSL(xml, url,SSLCERT_PATH, SSLKEY_PATH,second=30, cert=True, post=True):

"""使用证书"""

curl = pycurl.Curl()

curl.setopt(pycurl.URL, url)

curl.setopt(pycurl.TIMEOUT, second)

#设置证书

#使用证书:cert 与 key 分别属于两个.pem文件

#默认格式为PEM,可以注释

if cert:

curl.setopt(pycurl.SSLKEYTYPE, "PEM")

curl.setopt(pycurl.SSLKEY, SSLKEY_PATH)

curl.setopt(pycurl.SSLCERTTYPE, "PEM")

curl.setopt(pycurl.SSLCERT, SSLCERT_PATH)

#post提交方式

if post:

curl.setopt(pycurl.POST, True)

curl.setopt(pycurl.POSTFIELDS, xml)

buff = StringIO()

curl.setopt(pycurl.WRITEFUNCTION, buff.write)

curl.perform()

return buff.getvalue()

def get_xml(params,APIKEY):

get_sign(params,APIKEY)

xml = ''

for k,v in params.items():

k = str(k).encode('utf-8')

v = str(v).encode('utf-8')

xml += '' + v + '' + k + '>'

xml+=''

return xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值