支付接口 - 微信,支付宝

在hbuider下的app 调用支付接口

支付宝功能申请

 

    1. 登录支付宝账号,签约申请“移动快捷支付”功能,操作流程参考:
      支付宝帮助中心

 

    1. 获取PID,参考教程:
      获取合作者身份ID

 

    1. 生成密钥(公钥和私钥),并提交到支付宝,参考教程:
      生成RSA密钥
      上传公钥

 

服务器生成订单示例(PHP)
参考开源示例代码github-支付宝
C#生成支付宝订单示例

微信支付功能申请

 

    1. 使用微信支付功能需到微信开放平台申请移动应用并开通支付功能
      微信APP支付接入商户服务中心
      申请应用后可以获取AppID和AppSecret值。

 

    1. 开通支付功能后可获取支付业务服务器配置数据
      PARTNER:财付通商户号
      PARTNER_KEY:财付通密钥
      PAYSIGNKEY:支付签名密钥

 

参考开源示例代码github-微信支付

 

       $result = array(
            ‘appid‘ => $appid,
            ‘noncestr‘=>$parameters[‘nonce_str‘],
            ‘package‘=>‘Sign=WXPay‘,
            ‘partnerid‘=>$mch_id,
            ‘prepayid‘=>$prepay_id,
            ‘timestamp‘=> time(),
        );
        // 重新签名
        $result[‘sign‘] = $this->getSign($result, $key);

  

调起启用支付宝或微信 plus.payment.request(pay[id].order,function(result)

微信遇到的问题: 启动微信(需要打包测试,其中app签名确保和微信签名对应),确保获取order的值是否正确,其中,注意sigh=两次重新生成,格式为order
字段名 变量名 类型 必填 示例值 描述
应用ID appid String(32) wx8888888888888888 微信开放平台审核通过的应用APPID
商户号 partnerid String(32) 1900000109 微信支付分配的商户号
预支付交易会话ID prepayid String(32) WX1217752501201407033233368018 微信返回的支付交易会话ID
扩展字段 package String(128) Sign=WXPay 暂填写固定值Sign=WXPay
随机字符串 noncestr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
时间戳 timestamp String(10) 1412000000 时间戳,请见接口规则-参数规定
签名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法

支付宝:主要密钥是否正确 出现al59错误->确保每一个值都不为空

其中order格式

"service=\"mobile.securitypay.pay\"&partner=\"2088002409047871\"&_input_charset=\"UTF-8\"&out_trade_no=\"14682865347699\"&subject=\"余额充值\"&payment_type=\"1\"&seller_id=\"tfshop@126.com\"&total_fee=\"0\"&body=\"\"&it_b_pay=\"1d\"&notify_url=\"http%3A%2F%2Fwww.taifengmall.com%2Fopenapi%2Fectools_payment%2Fparse%2Fectools_payment_plugin_alipayapp%2Fcallback%2F\"&sign=\"GGxRnW%2FxgYmf582zggZCZFw%2FY1nhHJRptUzHIqCT9SvsJxs4bcoOzo4cEoBkyFultEr2CowQEGAgradEtTrsZI9TSK3Rv0IheBS0EP28cSqZYOQH%2BLXqsmzI2nZiJ%2BYYD0zFcS45yzYAEn4ll8Fx4subACEzLzIM%2BBxYwHcp43g%3D\"&sign_type=\"RSA\""
遇到的问题:body为空,total_fee为0 

遇到的写法js写法:

$(‘body‘).on(‘ajaxSubmit.success‘, ‘#paycenter-form‘, function (e, data){
var paytype_id = $(‘input[name=payment]:checked‘).val();
$.payment($.paymentmapping[paytype_id], data, function (result){...}});
    $.payment = function (type, data, successCallback, failCallback){

// 支付方式名称转换,服务端与客户端的映射
$.paymentmapping = {
‘wxpayapp‘: ‘wxpay‘,
‘alipayapp‘: ‘alipay‘
};
})(jQuery);
参考文档

支付结果返回处理

支付宝

$this->callback_url = kernel::openapi_url(‘openapi.ectools_payment/parse/ectools/ectools_payment_plugin_alipayapp‘, ‘callback‘);

public function dopay($payment) { $mer_id = trim($this->getConf(‘mer_id‘, __CLASS__)); // 支付宝合作者身份ID,以2088开头的16位纯数字 $seller_id = trim($this->getConf(‘seller_id‘, __CLASS__)); // 支付宝账号 $rsa_private_key = trim($this->getConf(‘rsa_private_key‘, __CLASS__)); // 私钥字符串 $this->add_field(‘service‘, ‘mobile.securitypay.pay‘); // 必填,接口名称,固定值 $this->add_field(‘partner‘, $mer_id); // 必填,合作商户号 $this->add_field(‘_input_charset‘, ‘UTF-8‘); // 必填,参数编码字符集 $this->add_field(‘out_trade_no‘, $payment[‘payment_id‘]); // 必填,商户网站唯一订单号 $this->add_field(‘subject‘, $payment[‘shopName‘]); // 必填,商品名称 $this->add_field(‘payment_type‘, ‘1‘); // 必填,支付类型 $this->add_field(‘seller_id‘, $seller_id); // 必填,卖家支付宝账号 $this->add_field(‘total_fee‘, floatval($payment[‘total_amount‘])); // 必填,总金额,取值范围为[0.01,100000000.00] $this->add_field(‘body‘, $payment[‘body‘]); // 必填,商品详情 $this->add_field(‘it_b_pay‘, ‘1d‘); // 可选,未付款交易的超时时间 $this->add_field(‘notify_url‘,urlencode($this->callback_url)); // 可选,服务器异步通知页面路径 if($payment[‘show_url‘]){ $this->add_field(‘show_url‘, urlencode($payment[‘show_url‘])); // 可选,商品展示网站 } //生成订单 return $this->generate(trim($rsa_private_key)); } /** * 支付后返回后处理的事件的动作 * @params array - 所有返回的参数,包括POST和GET * @return null */ public function callback(&$recv) { $mer_id = trim($this->getConf(‘mer_id‘, __CLASS__)); // 支付宝合作者身份ID,以2088开头的16位纯数字 if($this->is_return_vaild($recv, $recv[‘sign‘])){ $ret[‘payment_id‘] = $recv[‘out_trade_no‘]; $ret[‘account‘] = $mer_id; $ret[‘bank‘] = app::get(‘ectools‘)->_(‘支付宝支付移动版‘); $ret[‘pay_account‘] = app::get(‘ectools‘)->_(‘付款帐号‘); $ret[‘currency‘] = ‘CNY‘; $ret[‘money‘] = $recv[‘total_fee‘]; $ret[‘paycost‘] = ‘0.000‘; $ret[‘cur_money‘] = $recv[‘total_fee‘]; $ret[‘trade_no‘] = $recv[‘trade_no‘]; $ret[‘t_payed‘] = strtotime($recv[‘notify_time‘]) ? strtotime($recv[‘notify_time‘]) : time(); $ret[‘pay_app_id‘] = "alipayapp"; $ret[‘pay_type‘] = ‘online‘; $ret[‘memo‘] = $recv[‘body‘]; switch($recv[‘trade_status‘]){ case ‘TRADE_SUCCESS‘: $ret[‘status‘] = ‘succ‘; echo ‘success‘; break; } }else{ $message = ‘Invalid Sign‘; $ret[‘status‘] = ‘invalid‘; echo ‘fail‘; } return $ret; }

notify_url 接口异步通知url

 

http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/71

个人总结,遇到问题,先看例子的返回值是怎样的,然后对比一下,记得看清楚,每一步的作用,一步一步解决

支付接口 - 微信,支付宝

上一篇:微信公众号开发教程[005]-消息管理-消息加解密


下一篇:微信测试工程师手把手教你做弱网络模拟测试