微信小程序> 小程序webview调用H5页面判断环境并发起小程序支付接口示例完整代码

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

浏览量:614 时间: 来源:得哥

小程序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"/scriptscript 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});  }  })

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

?phpdefined('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);// 按照要求计算signksort($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

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎