黔优媒体网-软文媒体自助发稿平台!
  1. 行业资讯
  2. 正文

小程序怎么实现微信支付

来源:黔优媒体网   时间:2024-09-19

小程序实现微信支付的方法:

前期准备:

1.开通了微信支付,并且小程序绑定了微信支付;

2.准备好小程序的appid,微信支付的商户号,支付秘钥。

商户系统和微信支付系统主要交互:

1、小程序内调用登录接口,获取到用户的openid

2、调用商户服务器支付统一下单接口,进行预支付

/**
 * 预支付请求接口(POST)
 * @param string $openid openid
 * @param string $body 商品简单描述
 * @param string $order_sn 订单编号
 * @param string $total_fee 金额
 * @return json的数据
public function prepay(){
 $config = $this- config;
 $openid = I( #39;post.openid #39;);
 $body = I( #39;post.body #39;);
 $order_sn = I( #39;post.order_sn #39;);
 $total_fee = I( #39;post.total_fee #39;);
 //统一下单参数构造
 $unifiedorder = array(
 #39;appid #39; = $config[ #39;appid #39;],
 #39;mch_id #39; = $config[ #39;pay_mchid #39;],
 #39;nonce_str #39; = self::getNonceStr(),
 #39;body #39; = $body,
 #39;out_trade_no #39; = $order_sn,
 #39;total_fee #39; = $total_fee * 100,
 #39;spbill_create_ip #39; = get_client_ip(),
 #39;notify_url #39; = #39;https:// #39;.$_SERVER[ #39;HTTP_HOST #39;]. #39;/Api/Wxpay/notify #39;,
 #39;trade_type #39; = #39;JSAPI #39;,
 #39;openid #39; = $openid
 $unifiedorder[ #39;sign #39;] = self::makeSign($unifiedorder);
 //请求数据
 $xmldata = self::array2xml($unifiedorder);
 $url = #39;https://api.mch.weixin.qq.com/pay/unifiedorder #39;;
 $res = self::curl_post_ssl($url, $xmldata);
 if(!$res){
 self::return_err( Can #39;t connect the server 
 // 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了
 //file_put_contents(APP_ROOT. #39;/Statics/log1.txt #39;,$res,FILE_APPEND);
 $content = self::xml2array($res);
 if(strval($content[ #39;result_code #39;]) == #39;FAIL #39;){
 self::return_err(strval($content[ #39;err_code_des #39;]));
 if(strval($content[ #39;return_code #39;]) == #39;FAIL #39;){
 self::return_err(strval($content[ #39;return_msg #39;]));
 self::return_data(array( #39;data #39;= $content));
 //$this- ajaxReturn($content);
}

3、调用商户服务器再次签名接口,返回支付数据

/**
 * 进行支付接口(POST)
 * @param string $prepay_id 预支付ID(调用prepay()方法之后的返回数据中获取)
 * @return json的数据
public function pay(){
 $config = $this- config;
 $prepay_id = I( #39;post.prepay_id #39;);
 $data = array(
 #39;appId #39; = $config[ #39;appid #39;],
 #39;timeStamp #39; = time(),
 #39;nonceStr #39; = self::getNonceStr(),
 #39;package #39; = #39;prepay_id= #39;.$prepay_id,
 #39;signType #39; = #39;MD5 #39;
 $data[ #39;paySign #39;] = self::makeSign($data);
 $this- ajaxReturn($data);
}

4、小程序内完成支付,商户服务器接收支付回调通知

小程序端代码:

wx.requestPayment({
 #39;timeStamp #39;: #39; #39;,
 #39;nonceStr #39;: #39; #39;,
 #39;package #39;: #39; #39;,
 #39;signType #39;: #39;MD5 #39;,
 #39;paySign #39;: #39; #39;,
 #39;success #39;:function(res){
 #39;fail #39;:function(res){
})

服务器回调通知:

//微信支付回调验证
public function notify(){
 $xml = $GLOBALS[ #39;HTTP_RAW_POST_DATA #39;];
 // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了
 //file_put_contents(APP_ROOT. #39;/Statics/log2.txt #39;,$res,FILE_APPEND);
 //将服务器返回的XML数据转化为数组
 $data = self::xml2array($xml);
 // 保存微信服务器返回的签名sign
 $data_sign = $data[ #39;sign #39;];
 // sign不参与签名算法
 unset($data[ #39;sign #39;]);
 $sign = self::makeSign($data);
 // 判断签名是否正确 判断支付状态
 if ( ($sign===$data_sign) ($data[ #39;return_code #39;]== #39;SUCCESS #39;) ($data[ #39;result_code #39;]== #39;SUCCESS #39;) ) {
 $result = $data;
 //获取服务器返回的数据
 $order_sn = $data[ #39;out_trade_no #39;]; //订单单号
 $openid = $data[ #39;openid #39;]; //付款人openID
 $total_fee = $data[ #39;total_fee #39;]; //付款金额
 $transaction_id = $data[ #39;transaction_id #39;]; //微信支付流水号
 //更新数据库
 $this- updateDB($order_sn,$openid,$total_fee,$transaction_id);
 }else{
 $result = false;
 // 返回状态给微信服务器
 if ($result) {
 $str= #39; xml return_code ![CDATA[SUCCESS]] /return_code return_msg ![CDATA[OK]] /return_msg /xml #39;;
 }else{
 $str= #39; xml return_code ![CDATA[FAIL]] /return_code return_msg ![CDATA[签名失败]] /return_msg /xml #39;;
 echo $str;
 return $result;
}

小程序端完整代码如下:

/**
 * 支付函数
 * @param {[type]} _payInfo [description]
 * @return {[type]} [description]
pay:function(_payInfo,success,fail){
 var payInfo = {
 body: #39; #39;,
 total_fee:0,
 order_sn: #39; #39;
 Object.assign(payInfo, _payInfo);
 if(payInfo.body.length==0){
 wx.showToast({
 title: #39;支付信息描述错误 #39;
 return false;
 if(payInfo.total_fee==0){
 wx.showToast({
 title: #39;支付金额不能0 #39;
 return false; 
 if(payInfo.order_sn.length==0){
 wx.showToast({
 title: #39;订单号不能为空 #39;
 return false; 
 var This = this;
 This.getOpenid(function(openid){
 payInfo.openid=openid;
 This.request({
 url: #39;api/pay/prepay #39;,
 data:payInfo,
 success:function(res){
 var data = res.data;
 console.log(data);
 if(!data.status){
 wx.showToast({
 title:data[ #39;errmsg #39;]
 return false;
 This.request({
 url: #39;api/pay/pay #39;,
 data:{prepay_id:data.data.data.prepay_id},
 success:function(_payResult){
 var payResult = _payResult.data;
 console.log(payResult);
 wx.requestPayment({
 #39;timeStamp #39;: payResult.timeStamp.toString(),
 #39;nonceStr #39;: payResult.nonceStr,
 #39;package #39;: payResult.package,
 #39;signType #39;: payResult.signType,
 #39;paySign #39;: payResult.paySign,
 #39;success #39;: function (succ) {
 success success(succ);
 #39;fail #39;: function (err) {
 fail fail(err);
 #39;complete #39;: function (comp) { 
}

推荐:《小程序开发教程》

以上就是小程序怎么实现微信支付的详细内容,更多请关注php中文网其它相关文章!

微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!


【免责申明】黔优媒体网以上展示内容来源于用户自主上传、合作媒体、企业机构或网络收集整理,版权争议与本站无关,文章涉及见解与观点不代表黔优媒体网官方立场,请读者仅做参考,本文标题:小程序怎么实现微信支付;欢迎转载,转载时请说明出处。若您认为本文侵犯了您的版权信息,或您发现该内容有任何违法/违规的内容,请您立即联系我们及时修正或删除。(邮箱号: kefu@qianu.com)
此操作需要登录,请先登录~
免费注册会员,尽享国内领先平台!