支付及退款流程详解
2. ⽤户标识 openid。也就是⽤户的⼩程序标识,在我
中说明了如何获取。川g是四川哪个城市的车牌号
3. 商户号 mch_id 。申请开通⽀付商户认证成功后发给你的邮件⾥有
4. 商户订单号 out_trade_no 。商户为这次⽀付⽣成的订单号
5. 总⾦额 total_fee 。订单总⾦额,很重要的⼀点是
单位是分
,要特别注意。
6. 服务器回调通知接⼝地址 notify_url。确认钱已经到账后,会往这个地址多次发送消息,告诉你顾客已经付完钱了,你需要返回消息
给表⽰你已经收到了通知。。这个地址不能有端⼝号,同时要能直接接受POST⽅法请求。
7. 交易类型 trade_type 。⼩程序⽀付此值统⼀为 JSAPI
8. 商品信息 Body。类似
"腾讯-游戏"
这种格式
9. 终端IP地址 spbill_create_ip 。终端地址IP,也就是请求⽀付的 IP 地址。
10. 随机字符串 nonce_str 。需要后端随机⽣成的字符串⽤于保证数据安全。要求不长于32位。
11. 签名 sign 。使⽤上⾯的所有参数进⾏相应处理加密⽣成签名。(具体处理⽅式可见下⽂代码,可直接复⽤。)小学数学教师总结
在处理好以上所有数据后,将这些数据以 XML 格式整理并以 POST ⽅法发送到
⽀付统⼀下单接⼝
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。公众平台⾥的 pro        $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(),//随机串 'p      }
/*      *请求统⼀下单接⼝      */ private function unifiedorder(){
$parameters = array( 'appid' => $this->APPID,//⼩程序id 'mch_id'=> $this->MCHID,//商户id 'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],//终端ip 'notify_url'=>$this->    }
//数组转字符串⽅法 protected function arrayToXml($arr){苹果id密码忘记了怎么重新设置
$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, F            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."    }
/*      *排序并格式化参数⽅法,签名时需要使⽤      */ protected function formatBizQueryParaMap($paraMap, $urlencode) {
$buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。