hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 文章 - 小程序 - 正文 君子好学,自强不息!

小程序付出及退款流程详解_微信小程序

2020-07-04小程序ki4网10°c
A+ A-
微信小程序的付出和退款流程

近期在做微信小程序时,触及到了小程序的付出和退款流程,所以也也许的将这方面的东西看了一个遍,就在这篇博客里总结一下。

起首申明一下,微信小程序付出的主要逻辑集合在后端,前端只需照顾付出所需的数据请求后端接口然后依据返回效果做相应胜利失败处置惩罚即可。我在后端运用的是php,固然在这篇博客里我不盘算贴一堆代码来申明付出的细致完成,而主要会侧重于全部付出的流程和一些细节方面的东西。所以运用其他后端言语的朋侪有须要也是能够看一下的。许多时刻开发的需乞降相应问题的处理真的要跳出言语语法层面,去从体系和流程的角度斟酌。好的,也不说什么空话了。进入正题。

一. 付出

付出主要分为几个步骤:

前端照顾付出须要的数据(商品id,购置数目等)提议付出请求

后端在吸收到付出请求后,处置惩罚付出数据,然后照顾处置惩罚后的数据请求 微信服务器付出一致下单接口

后端吸收到上一步请求微信服务器的返回数据,再次处置惩罚,然后返回前端让前端能够入手下手付出。

前端举行付出行动

前端付出完成后,微信服务器会向后端发送付出关照(也就是微信要通知你客户已付过钱了),后端依据这个关照一定付出完成,然后就去做付出完成后的相应行动,比方修正定单状况,增加生意营业日记啊等等。

从这几个步骤能够看出,后端主要的作用就是将付出须要的数据传给微信服务器,再依据微信服务器的相应一定付出是不是完成。

这个流程照样蛮轻易明白的。抽象的说,前端就是个主顾,后端就是店家,微信服务器的一致下单接口就像收银员。主顾跟店家说,
我是谁谁谁,如今我要付若干若干钱给你买什么什么。店家就跟收银员说,谁人谁谁谁要付若干钱,你预备收钱吧。收银员收到钱
后,就去通知店家,我已收到钱了,你给他东西吧。

下面就细致的申明一下各个步骤的细致完成

1. 前端请求付出

前端请求付出,就是简朴的照顾付出须要的数据,比方用户标识,付出金额,付出定单 ID 等等跟 **你的营业逻辑有关** 或许跟
 **下一步请求微信服务器付出一致下单接口须要的数据有关** 的相干数据,运用微信小程序的 wx.request( ) 去请求后端的支
 付接口。

2. 前端请求付出

后端吸收到前端发送的付出请求后,能够举行一下相干考证,比方推断一下用户有无问题,付出金额对不对等等。
在考证没什么问题,能够向微信服务器请求付出以后,后端须要运用 微信划定的数据花样 去请求微信的付出一致下单接口。

微信划定的请求数据:
这须要较多代码完成。由于须要的数据个数较多,而且还须要加密并以 XML 花样发送。
起首,有以下数据是运用小程序付出必需供应给微信服务器的参数。

小程序 appid。写小程序的也许没有不知道这个的。。。

用户标识 openid。也就是用户的小程序标识,在我上篇博客中申明了怎样猎取。

商户号 mch_id 。请求开通微信付出商户认证胜利后微信发给你的邮件里有

商户定单号 out_trade_no 。商户为此次付出生成的定单号

总金额 total_fee 。定单总金额,很主要的一点是单元是分,要特别注重。

微信服务器回调关照接口地点 notify_url。微信确认钱已到账后,会往这个地点屡次发送音讯,通知你主顾已付完钱了,

你须要返回音讯给微信示意你已收到了关照。。这个地点不能有端口号,同时要能直接接收POST要领请求。

生意营业范例 trade_type 。微信小程序付出此值一致为 JSAPI

商品信息 Body。类似"腾讯-游戏"这类花样

终端IP地点 spbill_create_ip 。终端地点IP,也就是请求付出的 IP 地点。

随机字符串 nonce_str 。须要后端随机生成的字符串用于保证数据平安。微信请求不善于32位。

署名 sign 。运用上面的一切参数举行相应处置惩罚加密生成署名。(细致处置惩罚体式格局可见下文代码,可直接复用。)

在处置惩罚好以上一切数据后,将这些数据以 XML 花样整顿并以 POST 要领发送到 微信付出一致下单接口 https://api.mch.weixin.qq.com/pay/unifiedorder 。

3.后端接收微信服务器返回数据

微信服务器在吸收到付出数据以后,假如数据没有问题,其会返回用于付出的相应数据,个中非常主要的是 名称为 prepay_id 的数据字段,须要将此数据返回前端,前端才继续付出。

因而,在后端吸收到微信服务器的返回数据后,须要举行相应的处置惩罚,终究返回到前端以下数据:

  1. appid 不需多说

  2. timeStamp 当前时候戳

  3. nonceStr 随机字符串

  4. package 就是上面提到的 prepay_id,不过牢记花样如 “prepay_id= prepay_id_item“。不然会致使毛病。

  5. signType 加密体式格局,平常应该是 MD5

  6. paySign 对以上数据举行相应处置惩罚并加密。

到这里,后端的付出接口已完成了吸收前端付出请求,并返回了前端付出所需数据的功用。

4. 前端提议付出

前端在吸收到返回数据后,运用 wx.requestPayment() 来请求提议付出。此 API 须要的对象参数各项值就是我们上一步返回的各个数据。

5.后端接收微信服务器回调

前端完成付出后,微信服务器确认付出已完成。就会向第一步中设置的回调地点发送关照。后端的吸收回调接口在吸收到关照后,就能够推断付出是不是完成,从而决议后续行动。

须要注重的是,在吸收到微信服务器的回调关照后,依据关照的result_code字段推断付出是不是胜利。在接收到胜利的关照后,后端须要返回success数据向微信服务器示知已获得回调关照。不然微信服务器会不断的向后端发送音讯。别的微信的关照是以XML花样发送的,在接收处置惩罚时须要注重。

微信的也许付出流程就是如许。以下是PHP语法的微信付出类,能够对比上面的步骤引见,加深明白。在须要付出时,直接传入参数实例化此类再挪用类的 pay 要领即可。

//微信付出类
class WeiXinPay{

    //=======【基本信息设置】=====================================
    //微信民众号身份的唯一标识
    protected $APPID = appid;//填写您的appid。微信民众平台里的
    protected $APPSECRET = secret;
    //受理商ID,身份标识
    protected $MCHID = '11111111';//商户id
    //商户付出密钥Key
    protected $KEY = '192006250b4c09247ec02edce69f6a2d';
    //回调关照接口
    protected $APPURL =      'https://smart.afei.com/receivesuc';
    //生意营业范例
    protected $TRADETYPE = 'JSAPI';
    //商品范例信息
    protected $BODY = 'wx/book';

    //微信付出类的组织函数
    function __construct($openid,$outTradeNo,$totalFee){
        $this->openid = $openid; //用户唯一标识
        $this->outTradeNo = $outTradeNo; //商品编号
        $this->totalFee = $totalFee; //总价
    }
    
    //微信付出类向外暴露的付出接口
    public function pay(){
        $result = $this->weixinapp();
        return $result;
    }
     
     //对微信一致下单接口返回的付出相干数据举行处置惩罚
     private function weixinapp(){
         $unifiedorder=$this->unifiedorder();

         $parameters=array(
          'appId'=>$this->APPID,//小程序ID
          'timeStamp'=>''.time().'',//时候戳
          'nonceStr'=>$this->createNoncestr(),//随机串
          'package'=>'prepay_id='.$unifiedorder['prepay_id'],//数据包
          'signType'=>'MD5'//署名体式格局
             );
         $parameters['paySign']=$this->getSign($parameters);

         return $parameters;
     }

    /*
     *请求微信一致下单接口
     */
    private function unifiedorder(){
        $parameters = array(
            'appid' => $this->APPID,//小程序id
            'mch_id'=> $this->MCHID,//商户id
            'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],//终端ip
            'notify_url'=>$this->APPURL, //关照地点
            'nonce_str'=> $this->createNoncestr(),//随机字符串
            'out_trade_no'=>$this->outTradeNo,//商户定单编号
            'total_fee'=>floatval($this->totalFee), //总金额
            'open_id'=>$this->openid,//用户openid
            'trade_type'=>$this->TRADETYPE,//生意营业范例
            'body' =>$this->BODY, //商品信息
        );
        $parameters['sign'] = $this->getSign($parameters);
        $xmlData = $this->arrayToXml($parameters);
        $xml_result = $this->postXmlCurl($xmlData,'https://api.mch.weixin.qq.com/pay/unifiedorder',60);
        $result = $this->xmlToArray($xml_result);
        return $result;
    }

   //数组转字符串要领
   protected function arrayToXml($arr){
        $xml = "<xml>";
        foreach ($arr as $key=>$val)
        {
            if (is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                 $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }

    protected function xmlToArray($xml){
        $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $array_data;
    }
    
    //发送xml请求要领
    private static function postXmlCurl($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); //严厉校验
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //请求效果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //post提交体式格局
        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);
        //运转curl
        $data = curl_exec($ch);
        //返回效果
        if ($data) {
            curl_close($ch);
            return $data;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            throw new WxPayException("curl失足,毛病码:$error");
        }
    }


    /*
     * 对要发送到微信一致下单接口的数据举行署名
     */
    protected function getSign($Obj){
         foreach ($Obj as $k => $v){
          $Parameters[$k] = $v;
         }
         //署名步骤一:按字典序排序参数
         ksort($Parameters);
         $String = $this->formatBizQueryParaMap($Parameters, false);
         //署名步骤二:在string后到场KEY
         $String = $String."&key=".$this->KEY;
         //署名步骤三:MD5加密
         $String = md5($String);
         //署名步骤四:一切字符转为大写
         $result_ = strtoupper($String);
         return $result_;
     }

    /*
     *排序并花样化参数要领,署名时须要运用
     */
    protected function formatBizQueryParaMap($paraMap, $urlencode)
    {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v)
        {
            if($urlencode)
            {
               $v = urlencode($v);
            }
            //$buff .= strtolower($k) . "=" . $v . "&";
            $buff .= $k . "=" . $v . "&";
        }
        $reqPar;
        if (strlen($buff) > 0)
        {
            $reqPar = substr($buff, 0, strlen($buff)-1);
        }
        return $reqPar;
    }

    /*
     * 生成随机字符串要领
     */
    protected function createNoncestr($length = 32 ){
         $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
         $str ="";
         for ( $i = 0; $i < $length; $i++ ) {
          $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
         }
         return $str;
         }
}

以上就是微信付出的相干流程。在理清思绪后,流程照样比较清楚和简朴的。重点在于须要注重一些细节问题,比方数据花样,加密要领等。

下面说一下微信小程序退款的细致完成

二.退款

小程序退款的流程和付款类似,但有一些细节上的差别。

起首退款的步骤一般以下:

  1. 用户前端点击退款按钮后,后端吸收到用户的退款请求经由过程商城背景显现给商户,商户一定许可退款后,后端再提议向微信退款接口的请求来请求退款。
  2. 后端向微信退款接口发送请求后,获得相应信息,一定退款是不是完成,依据退款是不是完成再去举行转变定单状况等营业逻辑。

退款的步骤相对微信付出来讲比较简朴。

值得注重的有以下两点:
1.向微信退款接口请求退款后,依据获得的相应是能够直接一定退款是不是完成的。不再须要设置特地的回调接口守候微信关照。固然假如须要也是能够在微信商户平台设置回调接口接收从而接收微信回调的,但并非必需的。
2.退款请求须要在请求服务器装置微信供应的平安证书,也就是说,提议退款请求相比较付出请求在请求时请求要领不能复用,由于微信退款须要照顾证书的请求,此证书可在请求微信商户号胜利后从微信商户平台自行下载,Linux下的PHP开发环境的证书只须要放在网站根目录的cert文件夹中即可。其他开发环境大概须要导入操纵。

下面解说一下退款的细致步骤

一. 用户提议退款请求

用户在前端提议退款请求,后端吸收到退款请求,将相应定单标记为请求退款,展现在背景.商户查看后,假如赞同退款再举行相应操纵.
今后才进入真正的退款流程.

二. 商户提议退款请求

    商户赞同退款后,后端即向微信供应的退款 API 提议请求.
    同请求微信付出API一样.退款请求也须要将须要的参数举行署名后以XML发送到微信的退款API 
    [https://api.mch.weixin.qq.com/pay/refund](https://api.mch.weixin.qq.com/pay/refund)

退款请求须要的参数以下(多个参数在付出API请求时也有运用):

  1. 小程序 appid。
  2. 商户号 mch_id 。请求开通微信付出商户认证胜利后微信发给你的邮件里有
  3. 商户定单号 out_trade_no 。退款定单在付出时生成的定单号
  4. 退款定单号 out_refund_no 。由后端生成的退款单号,须要保证唯一,由于多个一样的退款单号只会退款一次。
  5. 总金额 total_fee 。定单总金额,单元为分。
  6. 退款金额 refund_fee 须要退款的金额,单元一样为分
  7. 操纵员 op_user_id .与商户号雷同即可
  8. 随机字符串 nonce_str 。同付出请求
  9. 署名 sign 。运用上面的一切参数举行相应处置惩罚加密生成署名。(细致处置惩罚体式格局与付出雷同,可直接复用。)

三. 退款完成

在提议退款请求后,就能够直接依据请求的相应XML中的	result_code字段来推断退款是不是胜利,
从而对定单状况举行处置惩罚和后续操纵。不须要像付出那样守候另一个接口的关照来一定请求状况。固然如上文所说,
假如须要微信服务器发送关照到后端的话,能够到微信商户平台举行设置。

退款由于流程与付出迥然差别,因而退款的PHP类我挑选了直接继续付出类,
代码以下,注重辨别退款请求要领postXmlSSLCurl和付出请求要领postXmlCurl的区分,这也就是上文提到的退款须要的双向证书的运用。

   
     class WinXinRefund extends WeiXinPay{
        protected \$SSLCERT_PATH = 'cert/apiclient_cert.pem';//证书途径
        protected \$SSLKEY_PATH =  'cert/apiclient_key.pem';//证书途径
        protected \$opUserId = '1234567899';//商户号
        
    function __construct($openid,$outTradeNo,$totalFee,$outRefundNo,$refundFee){
        //初始化退款类须要的变量
        $this->openid = $openid;
        $this->outTradeNo = $outTradeNo;
        $this->totalFee = $totalFee;
        $this->outRefundNo = $outRefundNo;
        $this->refundFee = $refundFee;
    } 

    public function refund(){
        //对外暴露的退款接口
        $result = $this->wxrefundapi();
        return $result;
    }

    private function wxrefundapi(){
        //经由过程微信api举行退款流程
        $parma = array(
            'appid'=> $this->APPID,
            'mch_id'=> $this->MCHID,
            'nonce_str'=> $this->createNoncestr(),
            'out_refund_no'=> $this->outRefundNo,
            'out_trade_no'=> $this->outTradeNo,
            'total_fee'=> $this->totalFee,
            'refund_fee'=> $this->refundFee,
            'op_user_id' => $this->opUserId,
        );
        $parma['sign'] = $this->getSign($parma);
        $xmldata = $this->arrayToXml($parma);
        $xmlresult = $this->postXmlSSLCurl($xmldata,'https://api.mch.weixin.qq.com/secapi/pay/refund');
        $result = $this->xmlToArray($xmlresult);
        return $result;
    }

    //须要运用证书的请求
    function postXmlSSLCurl($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);
        //设置header
        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->SSLCERT_PATH);
        //默许花样为PEM,能够解释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY, $this->SSLKEY_PATH);
        //post提交体式格局
        curl_setopt($ch,CURLOPT_POST, true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
        $data = curl_exec($ch);
        //返回效果
        if($data){
            curl_close($ch);
            return $data;
        }
        else {
            $error = curl_errno($ch);
            echo "curl失足,毛病码:$error"."<br>";
            curl_close($ch);
            return false;
        }
    }}

## 三. 总结
    以上就是关于微信付出和退款的流程及相干学问的引见。文中的 PHP类 均封装直接可用。
    由于微信付出和退款触及的东西较为冗杂,许多人直接看官方文档大概会一头雾水,所以看过此文相识流程和要点后,再去看微信官方文档。一方面能够更清楚的相识小程序的付出和退款流程。另一方面,本文由于篇幅有限及作者才能有限,一定有无暇顾及或有所马虎的地方。为求稳妥,照样须要多看看官方开发文档。毕竟事涉付出,出个BUG可不是小事。
    末了扯点闲话吧。这篇博客原本应该在三个月前就宣布的,也算当时我从一窍不通到自力完成微信小程序商城前后端的总结系列的第一篇。然则公司倏忽涌现职员和项目的更改,致使治理和项目上都杂沓不堪,再加上个人的惰性,致使此篇博客一向拖到三个月后的今天赋断断续续写完。这三个月我的心态由于各种事起升沉伏,也很有一番风味。
    借用李志的一句歌词完毕这篇博客吧。下一篇是什么时刻也说不定了,我苦笑。
    
>我不再会把本身,愚昧的交给过去。我的生活和我的主意,今后相隔万里。

引荐教程:《微信小程序》

以上就是小程序付出及退款流程详解的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
小程序付出及退款流程详解_微信小程序

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>