小程序web-view调用H5页面判断环境并发起小程序支付接口示例完整代码

小程序web-view调用H5页面发起小程序支付接口示例完整代码(内含详细说明,适应于Ecshop和Ectouch被小程序内嵌的时候 既要实现公众号H5的微信支付 又要实现 小程序微信支付。当然其它内核的自营在线商城也是可以用这接口的)

小程序web-view调用H5页面发起小程序支付接口示例

这接口是我熬夜写出来的,服务端用的PHP,示例很完整了,有附带说明。

您可以进微信>>发现>>小程序搜索:飞机杯男用 进“飞机杯男用”这个小程序先看我做的接口演示,看这文章是不是您所需要的。当然小程序里面也有我的联系方式,可以通过小程序联系我,不忙的时可帮简单解答。希望能帮大家节省些时间。这支付接口可以用到ECtouch或其它thinkphp框架开发的站点。

接口说明

H5页面发起小程序支付代码:

<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
<script language="javascript">
var mini=false;
wx.miniProgram.getEnv(function(res){
if (res.miniprogram){
	//发起小程序支付
	wx.miniProgram.navigateTo({url: "/pages/wxpay/wxpay?log_id='.$order['log_id'].'&order_id='.$order['order_id'].'"});
	mini=true;
}
}); 
if(mini){
	return;
}else{
	//发起H5微信公众号支付
}
</script>

看演示的可以进微信>>发现>>小程序搜索:飞机杯男用
也可以进微信>>发现>>小程序搜索:飞机杯图片

好了,做完发起小程序支付的js之后下面就是做小程序前端代码了,也就是发起的时候所用到的/pages/wxpay/wxpay接收文件:

var app = getApp();
Page({
  data: {
    bt: 'bt'
  },

  onLoad: function (options) {
    var that = this;
    if (options.order_id) {
      //that.setData({ wdxop: options}),
      that.setLoading(options);
      // that.requestPayment(options);
    } else { wx.navigateBack();}
  },

  setLoading: function(a) {
    var that = this
    wx.login({
      success: function(res) {
        // 成功的话会返回:
        // {errMsg: "login:ok", code: "获取用户OpenID的ticket"}
        that.getOpenId(res.code,a)
      }
    })
  },
  getOpenId: function (jsCode,a) {
    var that = this

    wx.request({
      url: 'https://m.chunyigu.com/index.php?c=MiniPay&a=login',
      data: {
        js_code: jsCode // wx.login()时得到的ticket
      },
      success: function (res) {
        that.getPrePayId(res.data.openid,a)
      },
      fail: function (res) {
        that.setData({
          bt: ''
        }), wx.showModal({ title: "网络超时", content: "刷新重试", showCancel: !1 });
      }
    })
  },
  getPrePayId: function (openId, a) {
    var that = this
    wx.request({
      url: 'https://m.chunyigu.com/index.php?c=MiniPay&a=index&order_id=' + a.order_id + '&log_id=' + a.log_id ,
      data: {
        openid: openId
      },
      success: function (res) {
        that.pay(res.data)
      },
      fail:function (res) {
        that.setData({
          bt: ''
        })
      }
    })
  },
  // data是服务端返回的JSON
  // 加上success、fail回调后,正好符合wx.requestPayment()参数的格式
  pay: function (data) {

    data.success = function (res) {

      var pages = getCurrentPages();
      var currPage = pages[pages.length - 1];
      var prevPage = pages[pages.length - 2];
      prevPage.setData({
        url: "https://m.chunyigu.com/respond.php?code=wxpay&status=1",
      }),
      wx.navigateBack();

    },

    data.fail = function (res) {
      var pages = getCurrentPages();
      var currPage = pages[pages.length - 1];
      var prevPage = pages[pages.length - 2];
      prevPage.setData({
        url: "https://m.chunyigu.com/respond.php?code=wxpay&status=0",
      }),
      wx.navigateBack();
    }

    wx.requestPayment(data)
  },

  wdxreload: function(){
    
    var pages = getCurrentPages();
    var currentPage = pages[pages.length - 1]; //获取当前页面的对象
    var url = currentPage.route; //当前页面url
    var options = currentPage.options; //如果要获取url中所带的参数可以查看options
    wx.navigateTo({ url: "/pages/wxpay/wxpay?order_id=" + options.order_id+ '&log_id=' + options.log_id});
  }
  
})

好了,下面就是读取支付参数并生成签名发送给小程序的服务器端代码了:

<?php
defined('IN_ECTOUCH') or die('Deny Access');

class MiniPayController extends BaseController {

  	private $appid;
  	private $secret;

  	public function __construct() {
		parent::__construct();

    	$payment_info = array();
        $payment_info = model('Order')->payment_info(6);
		$RcgPayment = unserialize_config($payment_info['pay_config']);
    	$this->appid	 = 	$RcgPayment ['miniAppid'];		//此处填写您的	 小程序appid
    	$this->secret	 =		$RcgPayment ['miniSecret'];	//您的小程序密钥

  	}
	
	public function login() {
			
		$params = array(
		  'appid' => $this->appid,
		  'secret' => $this->secret,
		  'js_code' => $_GET['js_code'], // 小程序传来的ticket
		  'grant_type' => 'authorization_code',
		);

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/sns/jscode2session');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
		$output = curl_exec($ch);

		if (false === $output) {
		  echo 'CURL Error:' . curl_error($ch);
		}
		echo $output;
		
	}



    public function index() {
		
		$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
		$log_id = isset($_GET['log_id']) ? intval($_GET['log_id']) : 0;
		$this->user_id = $_SESSION['user_id'];
		$order = model('Users')->get_order_detail($order_id, $this->user_id);
		
		$payment_info = array();
        $payment_info = model('Order')->payment_info(6);
		$payment = unserialize_config($payment_info['pay_config']);
		
		$t = $_GET['t'];
		$mch_id = $payment['wxpay_mchid'];//受理商ID(即微信支付商户号)
		$mch_key = $payment['wxpay_key'];//商户支付密钥Key
		
		$params = array(
		  'appid' => $this->appid,  // 小程序appid
		  'mch_id' => $mch_id,
		  'nonce_str' => (string) mt_rand(10000, 99999),   // 随机串,32字符以内
		  'body' => '日用品1',   // 商品名
		  'out_trade_no' => substr( $order['order_sn'].'A'.($order['order_amount']*100).'B'.$log_id ,0,32),  // 订单号32字符以内。串接后取前32位。多次支付时如果重复的话,微信会返回“重复下单”
		  'total_fee' => $order['order_amount'] * 100,  // 订单费用,单位:分
		  'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
		  'notify_url' => 'https://m.chunyigu.com/api/notify/minipay.php',  // 支付成功后的回调地址,由腾讯服务端回调
		  'trade_type' => 'JSAPI',
		  'openid' => $_GET['openid'],  // 小程序传来的OpenID
		);

		// 按照要求计算sign
		ksort($params);
		$sequence = '';
		foreach ($params as $key => $value) {
		  $sequence .= "$key=$value&";
		}

		$sequence = $sequence . "key=".$mch_key;
		$params['sign'] = strtoupper(md5($sequence));

		// 给微信发出的请求,整个参数是个XML

		$xml = '<xml>' . PHP_EOL;
		foreach ($params as $key => $value) {
		  $xml .= "<$key>$value</$key>" . PHP_EOL;
		}
		$xml .= '</xml>';

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
		$output = curl_exec($ch);

		if (false === $output) {
		  echo 'CURL Error:' . curl_error($ch);
		}

		// 下单成功的话,微信返回个XML,里面包含prepayID,提取出来

		if (0 === preg_match('/<prepay_id><\!\[CDATA\[(\w+)\]\]><\/prepay_id>/', $output, $match)) {
				  //echo $output;
		  //exit(0);
		}

		// 这里不是给小程序返回个prepayID,而是返回一个包含其他字段的JSON
		// 这个JSON小程序自己也可以生成,放在服务端生成是出于两个考虑:
		// 1. 小程序的appid不用写在小程序的代码里,appid、secret信息全部由服务器管理,比较安全
		// 2. 计算paySign需要用到md5,小程序端使用的是JavaScript,没有内置的md5函数,放在服务端计算md5比较方便

		$prepayId = $match[1];
		$response= array(
		  'appId' => $this->appid,		//小程序appid
		  'nonceStr' => (string) mt_rand(10000, 99999),		  // 随机串,32个字符以内
		  'package' => 'prepay_id=' . $prepayId,
		  'signType' => 'MD5',
		  'timeStamp' => (string) time(),		  // 时间戳,注意得是字符串形式的
		);
		$sequence = '';
		foreach ($response as $key => $value) {
		  $sequence .= "$key=$value&";
		}
		$response['paySign'] = strtoupper(md5("{$sequence}key=".$mch_key));

		echo json_encode($response);
	}


    /**
     * 响应操作
     */
    function callback($data)
    {
        if ($_GET['status'] == 1) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 响应操作
     */
    function notify($data)
    {
        $inputdata = file_get_contents("php://input");
        if (! empty($inputdata)) {
			
            $payment = model('Payment')->get_payment("wxpay");
            $postdata = json_decode(json_encode(simplexml_load_string($inputdata, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
            /* 检查插件文件是否存在,如果存在则验证支付是否成功,否则则返回失败信息 */
            // 微信端签名
            $wxsign = $postdata['sign'];
            unset($postdata['sign']);

            // 微信附加参数
            $attach = $postdata['attach'];

            foreach ($postdata as $k => $v) {
                $Parameters[$k] = $v;
            }
            // 签名步骤一:按字典序排序参数
            ksort($Parameters);

            $buff = "";
            foreach ($Parameters as $k => $v) {
                $buff .= $k . "=" . $v . "&";
            }
            $String;
            if (strlen($buff) > 0) {
                $String = substr($buff, 0, strlen($buff) - 1);
            }
            // 签名步骤二:在string后加入KEY
            $String = $String . "&key=" . $payment['wxpay_key'];
            // 签名步骤三:MD5加密
            $String = md5($String);
            // 签名步骤四:所有字符转为大写
            $sign = strtoupper($String);
            // 验证成功
            if ($wxsign == $sign) {
                // 交易成功
                $returndata['return_code'] = 'SUCCESS';
            } else {
                $returndata['return_code'] = 'FAIL';
            }
        } else {
            $returndata['return_code'] = 'FAIL';
            $returndata['return_msg'] = '无数据返回';
        }
        // 数组转化为xml
        $xml = "<xml>";
        foreach ($returndata as $key => $val) {
            if (is_numeric($val)) {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            } else
                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
        }
        $xml .= "</xml>";

        echo $xml;
        exit();
    }
	
	

}

最后,你进手机微信 >> 发现 >> 搜索“飞机杯男用”这个小程序看看一下我所做的小程序支付接口流程演示。同时您也可以对照我做的公众号H5支付流程演示,在手机微信的搜一搜那里搜索:【春意谷】即可。当然也可以通过小程序里面的在线客服联系我,如果是我不忙的时候也可以帮你简单解答哦。希望我自己做的这接口能帮你节省一些时间。(如果您是菜鸟的话,那最好还是出几十块钱费用,我帮你直接做好来你自己去研究好啦,因为我没有这么多时间来做一对一教学哦,请谅解)

注:下面我做一个小广告,我们春意谷的服务理念是:春意谷——分享快乐、只售正品;有情、有趣,有生活!如果您要成人用品的话,可以在手机微信上搜索:春意谷
【春意谷】官网https://www.chunyigu.com 手机版官网https://m.chunyigu.com

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

得哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值