精华内容
下载资源
问答
  • 微信APP支付

    2016-07-29 16:00:31
    微信APP支付,便于开发者理解支付流程,微信的开发过程
  • /*** 微信app 支付** @license* @link* @since*/class wxAppPay{private $key = '8102b22a111111176d9f381ec6f837'; //商户号的是key 在微信商户平台上自己设定的api密钥 32位private $appid = 'wxbca5555502a91e9a'...

    /**

    * 微信app 支付

    *

    * @license

    * @link

    * @since

    */

    class wxAppPay

    {

    private $key = '8102b22a111111176d9f381ec6f837'; //商户号的是key 在微信商户平台上自己设定的api密钥 32位

    private $appid = 'wxbca5555502a91e9a'; // 在微信开放平台申请的appid

    private $mchId = '1000000'; // 商户号

    private $payUrl = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //统一下单请求接口

    /*

    * total_fee 支付金额

    * out_trade_no 订单号

    * notify_url 回调地址

    */

    public function doPay($params)

    {

    $postData = array();

    $postData['appid'] = $this->appid;

    $postData['mch_id'] = $this->mchId;

    $postData['nonce_str'] = $this->createNoncestr();

    $postData['body'] = 'app支付';

    $postData['out_trade_no'] = date("YmdHis");

    $postData['total_fee'] = $params['total_fee'];

    $postData["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"];

    $postData['notify_url'] = $params['notify_url'];

    $postData['trade_type'] = 'APP';

    $postData["sign"] = $this->createSign($postData);

    //把数组转化成xml格式

    $xmlData = $this->arrayToXml($postData);

    $res = $this->curl_post($this->payUrl, $xmlData);

    $res = simplexml_load_string($res,NULL,LIBXML_NOCDATA);

    // 生成正式支付参数

    $data = array();

    $data['appid'] = $this->appid;

    $data['noncestr'] = $postData['nonce_str'];

    //微信修改接口参数,否则IOS报解析失败

    $data['package'] = 'Sign=WXPay';

    $data['partnerid'] = $this->mchId;

    $data['prepayid'] = (string)$res->prepay_id;

    $data['timestamp'] = time();

    $data['sign'] = $this->createSign($data); //踩坑,这里一定要再签名一次,不能用上面的,也不能用返回的

    return $data;

    }

    //发送curl post

    private function curl_post($url = '', $param = array(),$headers = array()){

    if (empty($url)) {

    return false;

    }

    $ch = curl_init();//初始化curl

    curl_setopt($ch, CURLOPT_URL,$url);//抓取指定网页

    curl_setopt($ch, CURLOPT_HEADER, 0);//设置header

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上

    curl_setopt($ch, CURLOPT_POST, 1);//post提交方式

    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);

    if($headers) curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);

    $data = curl_exec($ch);//运行curl

    curl_close($ch);

    return $data;

    }

    //生成签名

    private function createSign($params)

    {

    //签名步骤一:按字典序排序参数

    ksort($params);

    $String = $this->formatBizQueryParaMap($params, false);

    //签名步骤二:在string后加入KEY

    $String = $String."&key=".$this->key;

    //签名步骤三:MD5加密

    $String = md5($String);

    //签名步骤四:所有字符转为大写

    $result_ = strtoupper($String);

    return $result_;

    }

    //按字典序排序参数

    private function formatBizQueryParaMap($params,$urlencode=false)

    {

    ksort($params);

    $buff = '';

    foreach($params as $key=>$val)

    {

    $buff .= $key . "=" . $val . "&";

    }

    $reqPar = substr($buff, 0, strlen($buff)-1);

    return $reqPar;

    }

    //将数组转换为xml格式

    private function arrayToXml($arr)

    {

    $xml = "";

    foreach($arr as $key=>$val)

    {

    if(is_numeric($val))

    $xml .= '' . $val . '' . $key . '>';

    else

    $xml .= "".$key.">";

    }

    $xml .="";

    return $xml;

    }

    //随机字符串

    private function createNoncestr($length=32)

    {

    $chars = 'abcdefghijklmnopqrstuvwxyz0123456789';

    $str = '';

    for($i=0;$i

    $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);

    }

    return $str;

    }

    }

    调用

    $payObj = new wxAppPay();

    $params = array(

    'total_fee' => 100,

    'out_trade_no' => date('YmdHis'),

    'notify_url' => '你自己的回调地址'

    );

    $data = $payObj->doPay();

    小坑提示: 如果参数都没有问题,在签名工具上也是说的签名成功。很大的可能是api key 的问题。 重新设置一下key就可以了。

    如果需要证书的,也是在这个商户后台去获取证书。

    展开全文
  • 微信APP支付java版

    2017-11-28 11:30:38
    微信APP支付java版,微信APP支付java版,微信APP支付java版,微信APP支付java版
  • 微信app支付宝app支付小程序支付集合三合一,亲测可以。
  • 微信支付-微信app支付java服务器端代码 实现功能:微信支付 支付查询 申请退款 退款查询 微信服务器端异步支付结果通知 参考博文:http://blog.csdn.net/fengshizty/article/details/53199356
  • 微信App支付

    2021-02-05 17:56:20
    2.1申请App支付 3.登录微信开放平台 注意:微信开放平台和微信公众平台不是一个账号和密码登录。 3.1填写基本资料 3.2填写开发者资质认证 这两个审核通过了才去创建移动应用,选择相应的应用栏目。否则创建移动应用...

    1.登录微信公众平台
    1.1点击基本配置
    配置公众AppID和AppSecret
    2.登录微信商户平台
    2.1申请App支付
    3.登录微信开放平台
    注意:微信开放平台和微信公众平台不是一个账号和密码登录。
    3.1填写基本资料
    3.2填写开发者资质认证
    这两个审核通过了才去创建移动应用,选择相应的应用栏目。否则创建移动应用不通过。
    3.3创建移动应用,填写应用基本信息。审核通过可以获取AppID和AppSecret.
    开发信息选择对应的平台,填写打包成功后的签名和包名。(Apk可以放在蒲公英上面,对应所有者点击连接可以下载)
    4.应用接入微信商户平台,选择App支付。
    4.1填写申请App支付,此时的AppID用于微信开放平台申请下来的AppID。
    4.2审核通过之后,在AppID账号管理点击关联AppID。
    4.3回到微信开放平台接收授权。
    5.开发
    应用nugut包:CloudHill.WeiXin.NetCore
    config文件配置:微信开放平台申请下来的AppID,商户号,商户密钥,
    业务层调用这个函数

    public static Result GetPayJson(string orderNo, decimal money, string openID, byte dtypOrderType)
            {
                //统一下单
                var ret = GetJsPayJson(orderNo, money, openID);
                if (ret.IsResultCodeSuccess())
                {
                    //调起支付接口
                    var handle = GetJsPaySign(
                        WeiXinConfing.WxOpenAppID,
                         WeixinHelper.Tools.GenerateTimeStamp().ToString(),
                         WeixinHelper.Tools.GetNonceStr(),
                         ret.prepay_id,
                         WeiXinConfing.MichScript,
                         WeiXinConfing.MichID
                         );
                    var result = handle.GetAllParameters();
                    return Result.GetSuccess(result);
                    
                }
                else
                {
                    throw new ArgumentException("支付失败-3:" + ret.return_msg);
                }
            }
       
      //统一下单
     private static Senparc.Weixin.MP.TenPayLibV3.UnifiedorderResult GetJsPayJson(string orderNum, decimal payMoney, string openID)
            {
                var tenPayData = new TenPayRequestData(
                    WeiXinConfing.WxOpenAppID,
                    WeiXinConfing.MichID,
                    "商品支付",
                    orderNum,
                    payMoney,
                    WeixinHelper.Tools.GetIP(),
                    WeiXinConfing.Domain + "/Api/PayNotify/WeiXinPayNotify",
                    TenPayV3Type.APP,
                    string.Empty,
                    WeiXinConfing.MichScript,
                    WeixinHelper.Tools.GetNonceStr(),
                    string.Empty,
                    string.Empty
                );
    
                LogHelper.Info("tenPayData:" + Newtonsoft.Json.JsonConvert.SerializeObject(tenPayData));
    
                var ret = WeixinHelper.Pay.Unifiedorder(tenPayData);
    
                LogHelper.Info("ret:" + Newtonsoft.Json.JsonConvert.SerializeObject(ret));
                return ret;
            }
    
    //调起支付接口请求参数
     public static Senparc.Weixin.MP.TenPayLibV3.RequestHandler GetJsPaySign(string appId, string timeStamp, string nonceStr, string prepay_id, string key,
                string partnerid)
            {
                //设置支付参数
                Senparc.Weixin.MP.TenPayLibV3.RequestHandler paySignReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
                paySignReqHandler.SetParameter("appid", appId);
                paySignReqHandler.SetParameter("partnerid", partnerid);
                paySignReqHandler.SetParameter("prepayid", prepay_id);
                paySignReqHandler.SetParameter("package", "Sign=WXPay");
                paySignReqHandler.SetParameter("noncestr", nonceStr);
                paySignReqHandler.SetParameter("timestamp", timeStamp);
                var paySign = paySignReqHandler.CreateMd5Sign("key", key);
                paySignReqHandler.SetParameter("sign", paySign);
    
                return paySignReqHandler;
            }
    //回调
     public ActionResult WeiXinPayNotify()
            {
                try
                {
                    FixResponseHandler resHandler = new FixResponseHandler(HttpContext);
                    resHandler.Init();
    
                    string return_code = resHandler.GetParameter("return_code");
                    string return_msg = resHandler.GetParameter("return_msg");
    
                    string res = null;
    
                    LogHelper.Info("微信支付回调:" + resHandler.ParseXML());
    
                    resHandler.SetKey(WeiXinConfing.MichScript);
    
                    //验证请求是否从微信发过来(安全)
                    if (resHandler.IsTenpaySign())
                    {
                        res = Handle(resHandler.GetParameter("out_trade_no"));
                    }
                    else
                    {
                        res = "wrong";
                    }
    
                    string xml = string.Format(@"<xml>
                                                <return_code><![CDATA[{0}]]></return_code>
                                                <return_msg><![CDATA[{1}]]></return_msg>
                                                </xml>", return_code, return_msg);
    
                    LogHelper.Info("微信支付处理结果:" + res);
    
                    return Content(xml, "text/xml");
                }
                catch (Exception ex)
                {
                    LogHelper.Info("Result_Error:" + ex.ToString());
    
                    return null;
                }
            }
     private string Handle(string out_trade_no)
            {
                var service = IocProxyFactory.GetService<IInsuranceService>();
    
                var result = service.SetWxFinishPayCallback(out_trade_no);
    
                if (result)
                {
                    return "success";
                }
                else
                {
                    return "wrong";
                }
            }
    
    展开全文
  • java 微信APP支付Demo.zip

    2018-07-16 09:32:01
    java 微信APP支付Demo.zipjava 微信APP支付Demo.zipjava 微信APP支付Demo.zip
  • 微信app支付和微信网页支付大致相同,但是细节上还是有些区分的 1.微信网页支付代码 @PostMapping(value = "wxPay") @ApiOperation("微信充值") @ResponseBody public synchronized ResultModel wxPay...

    微信app支付和微信网页支付大致相同,但是细节上还是有些区分的

     

    1.微信网页支付代码

     

     @PostMapping(value = "wxPay")
        @ApiOperation("微信充值")
        @ResponseBody
        public synchronized ResultModel wxPay(HttpServletRequest request,String accessToken,double amount) {
            ZcUser user = (ZcUser) JedisUtil.getObject(accessToken);
            if (null!=user) {
                ZcPay zcPay = new ZcPay();
                zcPay.setCreateTime(LocalDateTime.now());
    
                BigDecimal bg = new BigDecimal(amount);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                zcPay.setPayMoney(f1);
                String orderNum = UUID.randomUUID().toString().replaceAll("-", "");
                zcPay.setPayNo(orderNum);
                zcPay.setUserId(user.getUserId());
                zcPayService.save(zcPay);
                Map<String, String> resultMap = getWxPayvip(orderNum, f1, request,user.getUserOpenId());
                return ResultModel.success(resultMap);
            }
            return  ResultModel.failure(102,"请先登录");
        }
     public Map<String, String> getWxPayvip(String orderNum, Double amount, HttpServletRequest request,String openid) {
            Props props = new Props("config.properties", "utf-8");
            WxPayApiConfig apiConfig = null;
            try {
                apiConfig = WxPayApiConfigKit.getApiConfig("wx5bb27f7eed2c1292");
            } catch (Exception ex) {
                apiConfig = WxPayApiConfig.New()
                        .setAppId("wx5bb27f7eed2c1292")
                        .setMchId(props.getStr("shopNo"))
                        .setPaternerKey(props.getStr("shopSecret")).setNotifyUrl(props.getStr("notifyUrl"))
                        .setPayModel(WxPayApiConfig.PayModel.BUSINESSMODEL);//PayModel.BUSINESSMODEL:普通商户模式  PayModel.SERVICEMODE:服务商模式
                WxPayApiConfigKit.setThreadLocalWxPayApiConfig(apiConfig);
            }
            Map<String, String> resultMap = null;
            Map<String, String> maps = new HashMap<>();
            maps.put("appid", apiConfig.getAppId());
            maps.put("openid",openid);
            maps.put("mch_id", apiConfig.getMchId());
            maps.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
            maps.put("body", "body");
            maps.put("out_trade_no", orderNum);
            amount = amount * 100;
            maps.put("total_fee", amount.intValue() + "");
            maps.put("spbill_create_ip", IpKit.getRealIp(request));
            maps.put("notify_url",apiConfig.getNotifyUrl());
            maps.put("trade_type", "JSAPI");
            maps.put("sign", PaymentKit.createSign(maps, apiConfig.getPaternerKey()));
            String orderResult = WxPayApi.pushOrder(false, maps);
            resultMap = PaymentKit.xmlToMap(orderResult);
            if ("SUCCESS".equals(resultMap.get("return_code"))) {
                Map<String, String> signMap = new HashMap<>();
                signMap.put("appId", resultMap.get("appid"));
                signMap.put("nonceStr", UUID.randomUUID().toString().replaceAll("-", ""));
                signMap.put("package", "prepay_id="+resultMap.get("prepay_id"));
                //System.out.println(resultMap.get("prepay_id"));
               // signMap.put("partnerid", apiConfig.getPaternerKey());
                signMap.put("signType","MD5");
                signMap.put("timeStamp", (System.currentTimeMillis() / 1000) + "");
                String sign = PaymentKit.createSign(signMap, apiConfig.getPaternerKey());
                signMap.put("sign", sign);
                return signMap;
            }
            return resultMap;
        }

     

    2.微信app支付

     

     @PostMapping("pay")
        @ResponseBody
        public Result pay(String taskName, String orderNum, Double amount, Integer payType, HttpServletRequest request) throws IOException, AlipayApiException {
            if (1 == payType) {
                String sign = getAlipaySign(taskName, orderNum, amount);
                return ResultUtil.success(sign);
            } else {
                Map<String, String> resultMap = getWxPay(orderNum, amount, request);
                return ResultUtil.success(resultMap);
            }
        }

     

        public Map<String, String> getWxPay(String orderNum, Double amount, HttpServletRequest request) {
            Props props = new Props("wx.properties", "utf-8");
            WxPayApiConfig apiConfig = null;
            try {
                apiConfig = WxPayApiConfigKit.getApiConfig("自己的appid");
            } catch (Exception ex) {
                apiConfig = WxPayApiConfig.New()
                        .setAppId("自己的appid")
                        .setMchId(props.getStr("wx.mchId"))
                        .setPaternerKey(props.getStr("wx.partnerKey")).setNotifyUrl(props.getStr("wx.notifyUrl"))
                        .setPayModel(WxPayApiConfig.PayModel.BUSINESSMODEL);//PayModel.BUSINESSMODEL:普通商户模式  PayModel.SERVICEMODE:服务商模式
                WxPayApiConfigKit.setThreadLocalWxPayApiConfig(apiConfig);
            }
    
            Map<String, String> resultMap = null;
            Map<String, String> maps = new HashMap<>();
            maps.put("appid", apiConfig.getAppId());
            maps.put("mch_id", apiConfig.getMchId());
            maps.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
            maps.put("body", "xxx");
            maps.put("out_trade_no", orderNum);
            amount = amount * 100;
            maps.put("total_fee", amount.intValue() + "");
            maps.put("spbill_create_ip", IpKit.getRealIp(request));
            maps.put("notify_url", apiConfig.getNotifyUrl());
            maps.put("trade_type", "APP");
            maps.put("sign", PaymentKit.createSign(maps, apiConfig.getPaternerKey()));
            String orderResult = WxPayApi.pushOrder(false, maps);
            resultMap = PaymentKit.xmlToMap(orderResult);
            if ("SUCCESS".equals(resultMap.get("return_code"))) {
                Map<String, String> signMap = new HashMap<>();
                signMap.put("appid", resultMap.get("appid"));
                signMap.put("partnerid", apiConfig.getPaternerKey());
                signMap.put("prepayid", resultMap.get("prepay_id"));
                signMap.put("noncestr", resultMap.get("nonce_str"));
                signMap.put("timestamp", (System.currentTimeMillis() / 1000) + "");
                signMap.put("package", "Sign=WXPay");
                String sign = PaymentKit.createSign(signMap, apiConfig.getPaternerKey());
                signMap.put("sign", sign);
                return signMap;
            }
            return resultMap;
    
        }

    微信支付回掉地址

    /**
         * 微信的回调接口
         * @param request
         * @return
         */
        @PostMapping("wxNotifyUrlvip")
        @ApiOperation("微信回调接口,不需要绑的")
        @ResponseBody
        public String wxNotifyUrlvip(HttpServletRequest request) {
            String xmlMsg = HttpKit.readData(request);
            Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
            String result_code = params.get("result_code");
            String return_code = params.get("return_code");
    //		// 微信支付订单号
            String transaction_id = params.get("transaction_id");
    //		// 商户订单号
            String out_trade_no = params.get("out_trade_no");
    
            //判断订单是否完成业务
            ZcPay order = zcPayService.getOne(new QueryWrapper<ZcPay>().eq("payNo", out_trade_no));
            if (order == null) {
                System.err.println("微信支付回调通知异常,订单不存在:" + out_trade_no);
                return "failure";
            }
            Integer state = order.getIsSuccess();
            if (state == 1) {
                //发送通知等
                Map<String, String> xml = new HashMap<>(16);
                xml.put("return_code", "SUCCESS");
                xml.put("return_msg", "OK");
                return PaymentKit.toXml(xml);
            }
            String paternerKey = props.getStr("shopSecret");
            if (PaymentKit.verifyNotify(params, paternerKey) && ("SUCCESS").equals(result_code) && "SUCCESS".equals(return_code)) {
                //更新订单信息
                System.out.println("支付成功============================================================");
                order.setIsSuccess(1);
                zcPayService.updateById(order);//更新订单状态为 1
          
    
    
            
           
               
    
                //发送通知等
                Map<String, String> xml = new HashMap<>(16);
                xml.put("return_code", "SUCCESS");
                xml.put("return_msg", "OK");
                return PaymentKit.toXml(xml);
            } else {
                System.err.println("验证签名失败");
                Map<String, String> xml = new HashMap<>(16);
                xml.put("return_code", "FAIL");
                xml.put("return_msg", "FAIL");
                return PaymentKit.toXml(xml);
            }
        }
    

     

    展开全文
  • 微信app支付

    2018-07-24 14:18:02
    微信开放平台,app接入微信支付开放接口的申请入口,open.weixin.qq.com 商户证书,我们后台服务器和微信服务器通过新的凭据 trade_type: JSAPI,NATIVE,APP 货币类型:CNY 交易金额:接口中参数支付金额单位为...

    支付商品分为好几类:

    1. 会员充值: member

    2. 试卷: paper

    3. 叶子节点,一键组卷: leaf

    4. 整棵树,一键下载: tree

    所以要设计一个支付类型

    订单半个小时内有效, 过期作废

    redis的key如何构成:

    手机号+类型+产品id

    手机号11位

    类型2位

    产品id分为好几种:

    tag

    bbs讨论了下,多数人觉得每个prepay_id都必须入库

    pay.开头的weixin网站, 进去, 点击商户平台, 产品中心, 可以看到已经开通的所有支付方式, 真操蛋。

    微信开放平台,app接入微信支付开放接口的申请入口,open.weixin.qq.com

    商户证书,我们后台服务器和微信服务器通过新的凭据

    trade_type:

    JSAPI,NATIVE,APP

    货币类型:CNY

    交易金额:接口中参数支付金额单位为分,对账单中交易金额单位为元

    body字段格式:

    使用场景                     支付模式               商品字段规则                                                           样例

    第三方APP APP支付 应用市场上的APP名字-商品概述 天天爱消除-游戏充值

    银行类型:

    字符型银行编码                                                                      银行名称

    CMB_DEBIT 招商银行(借记卡)
    CMB_CREDIT 招商银行(信用卡)

    签名类型: MD5

    校验方式:XML

    搭建HTTPS,参考:

    https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=10_4

    后台需要提供给app的接口:

    1. 请求生产支付订单

    需要知道:

    a. 支付类型,是微信还是支付宝

    b. 产品编码,是包月,包季,还是包年

     

    2. 支付完成后,后台查询实际支付结果

    后台需要调用微信支付的api:

    1. 统一下单API:/pay/unifiedorder

    2. 调用微信查询API查询支付结果:/pay/orderquery

    3. 调用关单接口:/pay/closeorder

    后台需要提供给微信的接口:

    1. 接受微信的通知,此通知包含支付结果

    后台自己需要具备的功能:

    1. 生成带签名的客户端支付信息

    2. 接收和保存支付通知

    在正式上线微信支付前还需要做接入验收

    APPID

    商户号:

     

    Http响应协议包含status code, header, body

     

    PC网站支付:

    单位分,对账单单位元,参数值不能带小数

    trade_type: NATIVE

    CNY

    时间为标准北京时间

    时间戳:自1970年1月1日0点0分0秒以来的秒数, 10位数字

    商户订单号:

    支持字母,数字,中划线,下划线, 竖线,星号, 半角字符, 根据当前系统时间加随机序列生成订单号

    body字段:

    xx教育-会员充值

    8. 银行类型:

    CMB_DEBIT  借记卡

    CMB_CREDIT  信用卡

    协议规则, 采用HTTPS

    POST方法提交

    UTF-8

    MD5/HMAC-SHA256

    请求和接收数据均需要校验签名

    先判断协议字段, 再业务, 再判断交易状态

    签名算法

    1. 字母顺序排序, key1=value1&key2=value2...======> stringA

    2. 从微信返回的对象, 微信方传送的sign参数不参与签名, 将我们自己平台计算的签名和微信的签名作教研

    3. 在2得到的stringA拼接上key得到stringSignTemp

    4. 对stringSignTemp做MD5

    5. 将4得到的串所有字符转化为大写

    6. key可以看代码Global

    涉及到的文件:app\web\rest\util\HDUtility

    app\settings\Global

    LearnOrderResource

    展示二维码开始, 每隔2秒钟查询一下后台服务器, 知道60秒结束

    涉及多线程问题,一边是微信什么时候调用回调函数, 一边是我们的前端不停的轮询。

     

    展开全文
  • 微信APP支付】接口文档V1.0【微信APP支付】接口文档V1.0【微信APP支付】接口文档V1.0【微信APP支付】接口文档V1.0【微信APP支付】接口文档V1.0
  • JPay 简单而不简洁的Android支付SDK,JPay是对微信App支付、支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调
  • thinkphpwxh5pay.php是一个封装类直接调用就可以 PHP微信h5支付源码手机浏览器唤醒微信app支付

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,949
精华内容 3,179
关键字:

微信app支付