微信小程序订单如何退款?

一.付款

付款主要分为几个步骤:

1前端用数据(商品id、购买数量等)发起支付请求。)支付所需。

后端收到支付请求后,对支付数据进行处理,然后用处理后的数据请求微信服务器的支付统一下单接口。

3后端接收上一步微信服务器返回的数据,再次处理,然后返回前端,让前端开始支付。

4前端支付动作

5前端付款完成后,微信服务器会向后端发送付款通知(即微信会告诉你客户已经付款),后端会根据这个通知确认付款,然后在付款完成后做相应的动作,比如修改订单状态,添加交易日志等等。

从这几个步骤可以看出,后端的主要功能是将支付所需的数据发送到微信服务器,然后根据微信服务器的响应来确定支付是否完成。

这个过程挺好理解的。形象地说,前端是客户,后端是店铺,微信服务器的统一点餐界面就像收银台。顾客跟店家说,我是谁,现在要给你买我想买的东西。店家跟收银员说,那个人要多少钱,你准备收钱。收银员收到钱后会告诉店家我收到钱了。请给他一些东西。

下面详细描述每个步骤的具体实现。

1.前端请求付款

前端的支付请求只是携带支付所需的数据,如用户ID、支付金额、支付订单ID等。,关系到你的业务逻辑或者下一步请求微信服务器支付统一订单接口所需的数据。使用微信小程序的wx.request()请求后台支付接口。

2.后端请求微信服务器。

后端收到前端发送的支付请求后,可以进行相关验证,比如判断用户是否有问题,支付金额是否正确等等。

在验证没有问题并向微信服务器申请支付后,后端需要使用微信规定的数据格式,请求微信统一的支付下单接口。

微信指定的请求数据:

这需要更多的代码实现。因为需要的数据量很大,而且需要加密,以XML格式发送。

首先,以下数据是使用小程序支付时必须提供给微信服务器的参数。

小程序appid。大概没有一个写小程序的人不知道这一点。。。

用户id openid。也就是用户的小程序标识,在我上一篇博客里解释了如何获取。

商家编号mch_id。微信支付商户认证申请成功后,微信向您发送邮件,内容为

商家订单编号out _ trade _ no。商家为此付款生成的订单编号。

总计_费用金额_费用。订单总额,很重要的一点是单位是分钟,要特别注意。

微信服务器回调通知接口地址notify_url。确认钱到账后,微信会多次发信息到这个地址,告诉你客户已经交钱了,需要你回微信表示已经收到通知。。该地址不能有端口号,并且必须能够直接接受POST方法请求。

交易类型trade_type。微信小程序把这个值作为JSAPI来支付。

商品信息体。类似“腾讯-游戏”的格式

终端IP地址spbill_create_ip。终端地址IP,即请求支付的IP地址。

随机字符串nonce_str。需要由后端随机生成的字符串来确保数据安全。微信要求不超过32位。

签名。使用以上所有参数做相应处理,加密生成签名。(具体处理方法见下面的代码,可以直接重用。)

以上数据全部处理完毕后,这些数据以XML格式排序,通过POST方法发送到微信支付统一订单接口/pay/unifiedorder。

3.后端接受微信服务器返回的数据。

微信服务器收到支付数据后,如果数据没有问题就会返回相应的数据进行支付,其中名为prepay_id的数据字段非常重要,需要返回给前端,前端才能继续支付。

因此,后端在收到微信服务器返回的数据后,需要进行相应的处理,最终向前端返回以下数据:

Appid不用多说

时间戳当前时间戳

非中心随机字符串

Package就是上面说的prepay_id,但是记住格式为“prepay_id= prepay_id_item”。否则会导致错误。

SignType加密方法,一般为MD5。

PaySign会对上述数据进行相应的处理和加密。

至此,后端支付接口完成了接收前端支付请求并返回前端支付所需数据的功能。

4.前端发起的支付

前端收到返回的数据后,使用wx.requestPayment()请求发起支付。这个API所需的对象参数值是我们在上一步中返回的数据。

5.后端接受微信服务器的回调。

前端完成支付后,微信服务器确认支付已完成。将向第一步中设置的回调地址发送通知。后端接收回调接口收到通知后,可以判断支付是否完成,再决定后续动作。

需要注意的是,收到微信服务器的回拨通知后,根据通知的result_code字段判断支付是否成功。后端收到成功通知后,需要返回成功数据通知微信服务器收到回调通知。否则微信服务器会一直给后台发消息。另外,微信的通知是XML格式发送的,在接受的时候需要注意。

这是微信的一般支付流程。下面是PHP语法的微信支付类,可以按照上面的步骤介绍,加深理解。需要支付时,只需传入参数实例化这个类,调用该类的pay方法即可。

//微信支付类

维信支付类{

//= = = = = =基本信息设置= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

//微信微信官方账号的唯一身份。

protected $ APPID = appid//填写您的appid。在微信公众平台

protected $ APPSECRET = secret

//接受者ID,标识

protected $ MC hid = ' 11111111 ';//商家id

//商户支付键Key

protected $ KEY = ' 192006250 B4 c 09247 EC 02 edce 69 F6 a 2d ';

//回调通知接口

protected $ APPURL = '/receive suc ';

//交易类型

protected $ TRADETYPE = ' JSAPI

//商品类型信息

protected $ BODY = ' wx/book ';

//微信支付类的构造器

function __construct($openid,$outTradeNo,$totalFee){

$ this-& gt;openid = $ openid//用户唯一标识

$ this-& gt;outTradeNo = $ outTradeNo//商品编号

$ this-& gt;totalFee = $ totalFee//总价

}

//微信支付类公开的支付接口

公共函数pay(){

$ result = $ this-& gt;weixinapp();

返回$ result

}

//处理微信统一订单接口返回的支付相关数据。

私有函数weixinapp(){

$ unified order = $ this-& gt;unified order();

$parameters=array(

appId ' = & gt$ this-& gt;APPID,//小程序ID

时间戳' = & gt。时间()。',//时间戳

nonceStr ' = & gt$ this-& gt;Creatnoncestr(),//随机字符串

package ' = & gtPrepay _ id = '。$统一订单['prepay _ id'],//数据包

signType ' = & gtMD5'//签名方法

);

$ parameters[' paySign ']= $ this-& gt;get sign($ parameters);

返回$ parameters

}

/*

*请求微信统一订购界面

*/

私有函数unifiedorder(){

$parameters = array(

appid ' = & gt$ this-& gt;APPID,//小程序ID

mch _ id ' = & gt$ this-& gt;MCHID,//商家ID

spbill _ create _ ip ' = & gt$ _服务器['远程_ADDR'],//终端ip

notify _ url ' = & gt$ this-& gt;APPURL,//通知地址

nonce _ str ' = & gt$ this-& gt;Creatnoncestr(),//随机字符串

out _ trade _ no ' = & gt$ this-& gt;OutTradeNo,///商户订单号

total _ fee ' = & gtfloat val($ this-& gt;TotalFee),//总金额

open _ id ' = & gt$ this-& gt;Openid,//用户OpenID

' trade _ type ' = & gt$ this-& gt;TRADETYPE,//交易类型

body ' = & gt$ this-& gt;正文,//商品信息

);

$ parameters[' sign ']= $ this-& gt;get sign($ parameters);

$ XML data = $ this-& gt;arrayToXml($ parameters);

$ XML _ result = $ this-& gt;postmlcurl($ XML data,'/pay/unifiedorder ',60);

$ result = $ this-& gt;XML to array($ XML _ result);

返回$ result

}

//数组到字符串的方法

受保护的函数arrayToXml($arr){

$ xml = " & ltxml >;

foreach($ arr as $ key = & gt;$val)

{

if (is_numeric($val)){

$xml。= " & lt。$key。" >。$瓦尔。“& lt/".$key。" >;

}否则{

$xml。= " & lt。$key。" & gt& lt![CDATA["。$瓦尔。"]]& gt;& lt/".$key。" >;

}

}

$xml。= " & lt/XML >;;

返回$ xml

}

受保护的函数xmlToArray($xml){

$ array _ data = JSON _ decode(JSON _ encode(SimpleXML _ load _ string($ XML,' SimpleXMLElement ',LIBXML_NOCDATA)),true);

返回$ array _ data

}

//发送xml请求的方法

私有静态函数postxmlurl($ XML,$url,$second = 30)

{

$ ch = curl _ init();

//设置超时

curl_setopt($ch,CURLOPT_TIMEOUT,$ second);

curl_setopt($ch,CURLOPT_URL,$ URL);

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格检查

//设置标题

curl_setopt($ch,CURLOPT_HEADER,FALSE);

//要求结果为字符串并输出到屏幕。

curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);

//帖子提交方法

curl_setopt($ch,CURLOPT_POST,TRUE);

curl_setopt($ch,CURLOPT_POSTFIELDS,$ XML);

curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,20);

curl_setopt($ch,CURLOPT_TIMEOUT,40);

set _ time _ limit(0);

//运行卷曲

$ data = curl _ exec($ ch);

//返回结果

if($data){

curl _ close($ ch);

返回$ data

}否则{

$ error = curl _ errno($ ch);

curl _ close($ ch);

ThrownnewwxPayException(" Curl error,错误码:$ error ");

}

}

/*

*签收数据发送到微信统一下单界面。

*/

受保护的函数getSign($Obj){

foreach($ Obj as $ k = & gt;$v){

$ Parameters[$ k]= $ v;

}

//签名第一步:按字典顺序对参数进行排序。

ksort($ Parameters);

$ String = $ this-& gt;formatBizQueryParaMap($ Parameters,false);

//签名第二步:在字符串后添加KEY。

$String = $String。“& ampkey= "。$ this-& gt;关键;

//签名步骤3: MD5加密

$ String = MD5($ String);

//签名第四步:所有字符大写。

$ result _ = strtoupper($ String);

返回$ result _;

}

/*

*签名所需的参数排序和格式化方法。

*/

受保护的函数formatBizQueryParaMap($paraMap,$urlencode)

{

$ buff =

ksort($ paraMap);

foreach($ paraMap as $ k = & gt;$v)

{

if($urlencode)

{

$ v = urlencode($ v);

}

//$buff。= strtolower($k)。"=" .$ v。" & amp;;

$buff。= $k . "= "。$ v。" & amp;;

}

$ reqPar

if (strlen($buff)>0)

{

$reqPar = substr($buff,0,strlen($ buff)-1);

}

返回$ reqPar

}

/*

*生成随机字符串的方法

*/

受保护的函数createnoncentr($ length = 32){

$ chars = " abcdefghijklmnopqrstuvwxyz 0123456789 ";

$ str =

for($ I = 0;$ i & lt$长度;$i++ ) {

$str。= substr($chars,mt_rand(0,strlen($chars)-1),1);

}

返回$ str

}

}

以上是微信支付的相关流程。理清思路之后,流程就比较清晰简单了。重点是要注意一些细节,比如数据格式,加密方式等。

下面说说微信小程序退款的具体实现。

二。退还

小程序退款的流程和支付类似,只是在细节上有些区别。

第一次退款程序通常如下:

1.用户点击退款按钮后,后端接收用户的退款请求,通过商城后台呈现给商家。商家确定允许退款后,后端向微信退款接口发起请求,要求退款。

2.后端向微信退款接口发送请求后,得到响应信息,确定退款是否完成,然后根据退款是否完成更改订单状态。

退款的步骤相对微信支付来说比较简单。

以下两点值得注意:

1.在微信退款界面请求退款后,可以根据回复直接确定退款是否完成。不需要设置专门的回调接口等待微信通知。当然,如果有必要,也可以在微信商家平台设置回调接口,接受微信回调,但不是必须的。

2.退款请求需要在请求服务器上安装微信提供的安全证书,也就是说,与支付请求相比,请求方法在请求时不能被重用,因为微信退款需要携带证书的请求,申请微信商家号成功后可以从微信商家平台下载,Linux下PHP开发环境的证书只需要放在网站根目录下的cert文件夹中即可。其他开发环境可能需要导入操作。

下面来解释一下退款的具体步骤。

1.用户发起退款请求。

用户在前端发起退款请求,后端收到退款请求,将相应订单标记为退款请求并在后台显示。商家核对后,同意退款就做相应的操作,然后就进入真正的退款流程。

2.商家发起退款请求。

商家同意退款后,后端向微信提供的退款API发起请求。

就像请求微信支付API一样,退款请求也需要签名并以XML的形式发送到微信退款API [/pay/refund](/pay/refund)。

退款请求所需的参数如下(在支付API请求时也会用到几个参数):

1.小程序appid。

2.商家编号mch_id。微信支付商户认证申请成功后,微信向您发送邮件,内容为

3.商户订单号out _ trade _ no .支付退款订单时生成的订单号。

4.退款单号out _ refund _ no .后台生成的退款单据号需要唯一,因为多张相同的退款单据只会退款一次。

5.总计_费用金额_费用。订单总金额(分钟)。

6.退款金额退款_费用要退的金额也是分钟。

7.操作员op_user_id与商户号相同。

8.随机字符串nonce_str。相同的付款申请

9.签名。使用以上所有参数做相应处理,加密生成签名。(具体处理方式和支付一样,可以直接重复使用。)

3.退款完成

发起退款请求后,可以根据请求的响应XML中的result_code字段直接判断退款是否成功,以便处理和跟进订单状态。不需要等待来自另一个界面的通知来确定请求状态,如付款。当然,如上所述,如果微信服务器需要向后端发送通知,可以在微信商家平台设置。

因为退款的过程类似于支付,所以我选择了退款的PHP类直接继承支付类。

代码如下。注意退款请求方法postXmlSSLCurl和付款请求方法postXmlCurl的区别,就是前面提到的退款所需的双向证书的使用。

````

类WinXinRefund扩展WeiXinPay{

protected \ $ SSL cert _ PATH = ' cert/API client _ cert . PEM ';//证书路径

protected \ $ SSL key _ PATH = ' cert/API client _ key . PEM ';//证书路径

protected \ $ op userid = ' 1234567899 ';//商家编号

function __construct($openid,$outTradeNo,$totalFee,$outRefundNo,$refundFee){

//初始化退款类所需的变量。

$ this-& gt;openid = $ openid

$ this-& gt;outTradeNo = $ outTradeNo

$ this-& gt;totalFee = $ totalFee

$ this-& gt;outre fund no = $ outre fund no;

$ this-& gt;refundFee = $ refundFee

}

公共功能退款(){

//对外曝光退款接口

$ result = $ this-& gt;wxref undapi();

返回$ result

}

私有函数wxrundapi(){

//通过微信api退款流程

$parma = array(

appid ' = & gt$ this-& gt;APPID,

mch _ id ' = & gt$ this-& gt;麦克希德,

nonce _ str ' = & gt$ this-& gt;createNoncestr(),

out _ refund _ no ' = & gt$ this-& gt;outRefundNo,

out _ trade _ no ' = & gt$ this-& gt;奥特拉德诺,

total _ fee ' = & gt$ this-& gt;总费用,

退款_费用' = & gt$ this-& gt;拒绝费,

op _ user _ id ' = & gt$ this-& gt;opUserId,

);

$ parma[' sign ']= $ this-& gt;get sign($ parma);

$ XML data = $ this-& gt;arrayToXml($ parma);

$ XML result = $ this-& gt;postmlsslcurl($ XML data,'/sec API/pay/refund ');

$ result = $ this-& gt;XML to array($ XML result);

返回$ result

}

//需要证书的请求

函数postxmlslcurl($ XML,$url,$second=30)

{

$ ch = curl _ init();

//超时时间

curl_setopt($ch,CURLOPT_TIMEOUT,$ second);

//在这里设置代理,如果有的话。

//curl_setopt($ch,CURLOPT_PROXY,' 8 . 8 . 8 . 8 ');

//curl_setopt($ch,CURLOPT_PROXYPORT,8080);

curl_setopt($ch,CURLOPT_URL,$ URL);

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);

//设置标题

curl_setopt($ch,CURLOPT_HEADER,FALSE);

//要求结果为字符串并输出到屏幕。

curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);

//设置证书

//使用证书:cert和key分属两个。pem文件。

//默认格式是PEM,可以注释。

curl_setopt($ch,CURLOPT_SSLCERTTYPE,' PEM ');

curl_setopt($ch,CURLOPT_SSLCERT,$ this-& gt;SSL cert _ PATH);

//默认格式是PEM,可以注释。

curl_setopt($ch,CURLOPT_SSLKEYTYPE,' PEM ');

curl_setopt($ch,CURLOPT_SSLKEY,$ this-& gt;SSL key _ PATH);

//帖子提交方法

curl_setopt($ch,CURLOPT_POST,true);

curl_setopt($ch,CURLOPT_POSTFIELDS,$ XML);

$ data = curl _ exec($ ch);

//返回结果

if($data){

curl _ close($ ch);

返回$ data

}

否则{

$ error = curl _ errno($ ch);

echo中的错误“curl,错误代码:$ error”。"

curl _ close($ ch);

返回false

}

}}

三。摘要

以上是对微信支付退款的流程和相关知识的介绍。本文中的PHP类是封装的,可以直接使用。

因为微信支付和退款涉及的东西比较复杂,很多人直接看官方文件可能会比较困惑,所以看完这篇文章了解流程和要点后,再去看微信的官方文件。一方面可以更清晰的了解小程序的支付和退款流程。另一方面,由于篇幅有限,作者能力有限,肯定有忙得顾不上或者出错的地方。保险起见,还是要多看看官方的开发文档。毕竟涉及到付费,做个BUG也不是小事。微信商店小程序是微信官方推出的免费商城小程序,但微信商店小程序不支持订单实时通知,商家只能通过手动刷新网页来了解新订单。如何在手机上实时收到订单提醒并发货?要么通过第三方服务(成本高),要么自己做(零成本)。

微信在今年9月推出了小程序云开发平台。简单来说,腾讯为小程序提供免费服务器。我们可以利用腾讯的免费服务器实现订单通知、手机发货、订单自动打印等所有功能。

先看视频!这是完成后的样子。可以实时收到订单通知,自动打印订单,在手机上发货。仔细看,功能更多,亮点更多。如果你觉得还可以,可以继续看施工步骤。

施工步骤如下:

重用微信官方账号的资质快速创建小程序

申请这个小程序的目的是为了获得腾讯的免费服务器。有了服务器,什么都可以做。具体申请步骤这里就不细说了,大家可以自己在百度上搜索。

获取AppId和开发者密码

获取微信官方账号的AppID和密码,微信商店AppId,创建小程序AppId和密码。这些信息将被导入到创建的applet中。有了这些信息,小程序就可以为微信店铺提供服务。

下载微信开发者工具,新建小程序项目。

在微信开发者工具中,新建一个项目。把微信商店小程序连接到这个小程序上,就可以通过微信:蔡赟搜索了。你会看到小程序运行速度非常快,碾压了市面上80%的商城小程序。

新建小程序项目

关联微信商店小程序

订单提醒

开发建设后,商户可以实时收到微信提醒。有两种提醒方式:服务通知和订单自动打印。服务通知是免费的。如果订单是自动打印的,商家需要购买云打印机。(就是那种外卖打印机)

服务通知提醒

订单自动打印提醒

手机送货

商家收到订单提醒后,可以直接点击进入小程序发货界面。买家也可以收到送货提醒。

更多功能(分享朋友圈、会员管理、员工管理等。)还没写,以后继续更新。通过视频可以看到更多信息。一定要看。