如果您想了解android微信支付源码分享和asp微信支付源码的知识,那么本篇文章将是您的不二之选。我们将深入剖析android微信支付源码分享的各个方面,并为您解答asp微信支付源码的疑在这篇文章中
如果您想了解android微信支付源码分享和asp微信支付源码的知识,那么本篇文章将是您的不二之选。我们将深入剖析android微信支付源码分享的各个方面,并为您解答asp微信支付源码的疑在这篇文章中,我们将为您介绍android微信支付源码分享的相关知识,同时也会详细的解释asp微信支付源码的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- android微信支付源码分享(asp微信支付源码)
- Android 11 无法调起微信支付解决方案
- Android app 第三方微信支付接入详解
- Android APP接入微信支付
- Android App支付系列(一):微信支付接入详细指南(附官方支付demo)
android微信支付源码分享(asp微信支付源码)
本文为大家分享了android微信支付源码,供大家参考,具体内容如下
参数配置
public static final String APP_ID ; /** 在微信开放平台注册app,微信给分配的id **/ public static final String MCH_ID; /** 申请开通微信支付,成功后微信会给你发一封邮件,给你分配一个商户平台账号,在资料里有商户ID **/ public static final String API_KEY; /** 在微信发给你的那封邮件里,给你分配的微信商户平台账号,在里面设置一个api_key **/
获取到prepay_id
以上配置均正确,跑起来你会收到,微信这样的返回结果:
<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx8760819e9228eab6]]></appid> <mch_id><![CDATA[1244336402]]></mch_id> <nonce_str><![CDATA[p7F4pU6Kk8Ci3vbi]]></nonce_str> <sign><![CDATA[598ADE81CDEEFBEF1E7A9E4F73B03CD4]]></sign><result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx20151210110830853e5daa560147579483]]></prepay_id>//成功获取到预付id <Trade_type><![CDATA[APP]]></Trade_type> </xml>
在走第二步的时候,你可能出现的问题:
result_code><![CDATA[APP_ID与商户ID不匹配]]></result_code>//商户id不对
result_code><![CDATA[签名错误]]></result_code>//在拼装产品参数的时候,中文类容,要指定编码,否则乱码,会报这个错误;
成功获取到了,prepay_id,这个时候,支付界面还调不起来?
/***注意:
1.如果,你申请开通微信支付的app,是在微信开放平台注册的,使用eclipse默认签名,那么你现在在开发环境下,就可以调起来支付页面
2.如果,在开放平台的app,签名使用自定义的签名,则你需要使用该签名打包,再跑起来,就可以调其微信支付
***/
微信支付结果回调在哪里?
1.app客户端,我们在这个类里面接受支付的回调结果
/**
上色的地方,需要你改成自己的app_id
**/
注意:
/** 这个activity,是个透明的activity,回调完,你需要结束掉它* 2.服务端 **/ packageParams.add(new BasicNameValuePair("notify_url","http://121.40.35.3/test")); /** 需要指定一个回调接口,用于微信来调用,通知服务端,修改数据 */
微信支付可用的demo下载:http://xiazai.jb51.net/201608/yuanma/androidwxpay(jb51.net).rar
本文已被整理到了《Android微信支付教程汇总》,欢迎大家学习阅读。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
Android 11 无法调起微信支付解决方案
Android 11 加强了隐私保护策略,软件包可见性 ,将会导致第三方应用通过微信OpenSDK的接口无法正常拉起微信
当 targetSdkVersion=30 时会出现这个问题,
解决方案
- 第一步 Android Studio 需要升级至 3.3 及以上
- 第二步 Android SDK Build-Tools 需要升级至 30 及以上版本
- 第三步 com.android.tools.build:gradle 需要升级至 3.6.0 版本,建议升级至最新的 3.6.4 版本
- 第四步 AndroidManifest.xml 清单文件中添加 queries 标签,填入将要调用起的其他 APP 比如这里的微信的包名
<manifest package="com.example.app">
<queries>
<package android:name="com.tencent.mm" />
</queries>
...
</manifest>
本文同步分享在 博客“早起的年轻人”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
Android app 第三方微信支付接入详解
<div> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block"></path></svg> <p>微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽。 <br> 还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar</p>
<p><strong>首先就处理略坑的一个问题,app应用签名和包名的问题。</strong></p>
<p>商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。 <br> 如图:</p>
<p><img src="https://img-blog.csdn.net/20160518173121914" alt="这里写图片描述" title=""></p>
<p>应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值。 <br> 应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图所示,绿色串即应用签名。签名工具下载地址<a href="https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk" rel="nofollow" target="_blank">https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk</a>,下载到手机上运行(<strong>该手机上必须要有你正式打包签名的那个apk</strong>),如下图;</p>
<p><img src="https://img-blog.csdn.net/20160518173457623" alt="这里写图片描述" title=""> <br> 然后把该值填写到微信开放平台里的应用签名那里。</p>
<p><strong>还有一种获取签名的方法;</strong> <br> 在Studio工具里面开发的话,在Terminal 窗口里面输入命令 keytool -v -list -keystore keystore.jks(keystore.jks是你签名的时候生成的文件,写上你自己文件的名字),运行即可看到。MD5;…一大串数……这样的一串,这就是签名。; <br> 在eclipse工具里面开发的话。打包的时候会看到的。MD5;…一大串数……(去掉里面的冒号,大写改成小写的填到微信开放平台里的应用签名那里)</p>
<p><strong>一。配置文件Androidmanifest </strong> </p>
<prename="code"><code> <span><<span>activity </span> <span>android:name</span>=<span>".teacher.ui.PayActivity"</span> <span>android:label</span>=<span>"@string/app_name"</span> <span>android:exported</span>=<span>"true"</span> <span>android:launchMode</span>=<span>"singleTop"</span>></span> <span><<span>intent-filter</span>></span> <span><<span>action</span> <span>android:name</span>=<span>"android.intent.action.VIEW"</span>/></span> <span><<span>category</span> <span>android:name</span>=<span>"android.intent.category.DEFAULT"</span>/></span> <span><<span>data</span> <span>android:scheme</span>=<span>"wx690b9cf56a4ec056"</span>/></span> //写入你的appid <span></<span>intent-filter</span>></span> <span></<span>activity</span>></span></code></pre>
<p><strong>二。调起微信支付</strong></p>
<p>PayActivity里面 <br> 在onCreate里面初始化IWXAPI </p>
<prename="code"><code> <span>public</span> <span>static</span> <span>final</span> String APP_ID = <span>"wx690b9cf56a4ec056"</span>; <span>private</span> IWXAPI api; <span>protected</span> <span>void</span> <span>onCreate</span>(Bundle savedInstanceState) { <span>super</span>.onCreate(savedInstanceState); setContentView(R.layout.activity_affirm_order); api = WXAPIFactory.createWXAPI(AffirmOrderActivity.<span>this</span>, APP_ID, <span>true</span>); api.registerApp(APP_ID); }</code></pre>
<p>发起支付代码 <br> 你没有看错,就只有这么点代码,里面需要的值你们自己的后台会返回的,拿过来塞到里面就好</p>
<prename="code"><code> PayReq req = new PayRe<span>q()</span>; req.appId = APP_ID; req.partnerId = <span>""</span>; req.prepayId = <span>""</span>; req.packageValue = <span>""</span>; req.nonceStr = <span>""</span>; req.timeStamp = <span>""</span>; req.sign = <span>""</span>; api.sendRe<span>q(req)</span>; <span>//</span>以上代码就是发起微信支付的方法</code></pre>
<p><strong>三。支付结果的处理</strong></p>
<pre><code>这里面分为两步 1,微信提供的支付结果的类叫WXPayEntryActivity, 微信开放平台有个 不成文的规定(文档里没有说明),就是回调的Activity必须是:你的包名+.wxapi.WXPayEntryActivity.java </code></pre>
<p>如下;</p>
<prename="code"><code><span>public</span> <span><span>class</span> <span>WXPayEntryActivity</span> <span>extends</span> <span>Activity</span> <span>implements</span> <span>IWXAPIEventHandler</span>{</span> <span>private</span> IWXAPI api; <span>@Override</span> <span>public</span> <span>void</span> <span>onCreate</span>(Bundle savedInstanceState) { <span>super</span>.onCreate(savedInstanceState); TextView tv = <span>new</span> TextView(<span>this</span>); tv.setText(<span>"支付结果"</span>); setContentView(tv); api = WXAPIFactory.createWXAPI(<span>this</span>, AffirmOrderActivity.APP_ID); api.handleIntent(getIntent(), <span>this</span>); } <span>@Override</span> <span>protected</span> <span>void</span> <span>onNewIntent</span>(Intent intent) { <span>super</span>.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, <span>this</span>); } <span>@Override</span> <span>public</span> <span>void</span> <span>onReq</span>(BaseReq req) { } <span>@Override</span> <span>public</span> <span>void</span> <span>onResp</span>(BaseResp resp) { <span>if</span> (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { AlertDialog.Builder builder = <span>new</span> AlertDialog.Builder(<span>this</span>); builder.setTitle(<span>"提示"</span>); builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode))); builder.show(); } } } <span>//回调中errCode值</span> <span>// 0 成功 展示成功页面</span> <span>//-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。</span> <span>//-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。</span></code></pre>
<pre><code>2,在配置文件Androidmanifest注册WXPayEntryActivity </code></pre>
<prename="code"><code> <activity android:name=<span>"(你的包名).wxapi.WXPayEntryActivity"</span> android:exported=<span>"true"</span><span>//这一句一定不能少</span> android:launchMode=<span>"singleTop"</span> /></code></pre>
<p>至此app端的微信就搞定了,当然还有后台去回调,但是和app没关系。</p>
<p><strong>欢迎入群一起学习 QQ群 548629089</strong></p> </div>
Android APP接入微信支付
一、微信支付的架构和流程图
再来看一下成功调起微信支付的界面
二、配置工程
下载好微信开发的架包,链接为:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
2.1 这里必须要有wxapi这个包名,同时必须有WXPayEntryActivity这个类名,否则无法调起微信支付,(开发文档没有标注,废了好大周章)
2.2 支付成功通知:在WXPayEntryActivity的OnResp中处理,不能以微信返回的通知界面为准(我遇到的情况,网络不稳定的时候,微信返回界面提示支付失败,但是收到微信通知其实已经支付成功了),必须要去自己的服务器查询支付状态,这里微信建议用轮循机制去查询(最好听微信劝,O(∩_∩)O哈哈~),
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
builder.setMessage(getString(R.string.pay_result_callback_msg, resp.errStr +";code=" + String.valueOf(resp.errCode)));
builder.show();
}
}
2.3 生成prepay_id,在服务器完成,由服务器去跟微信服务器交互,客户端不需要参与
/**
* 获取预支付订单号:
* prepay_id(服务器完成)!!!
* 注意:如果服务端开发文档跟客户端demo里的参数不一样,以demo里的参数为准,
* 否则服务器传过来的参数无法调起微信支付!!!
* */
private String genProductArgs() {
StringBuffer xml = new StringBuffer();
try {
String nonceStr = genNonceStr();
xml.append("</xml>");
List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));
packageParams.add(new BasicNameValuePair("body", "APP pay test"));
/**这里用的是mach_id,跟sign签名时参数名不同,一定要注意*/
packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
packageParams.add(new BasicNameValuePair("notify_url", "http://121.40.35.3/test"));
packageParams.add(new BasicNameValuePair("out_trade_no",genOutTradNo()));
packageParams.add(new BasicNameValuePair("spbill_create_ip","127.0.0.1"));
packageParams.add(new BasicNameValuePair("total_fee", "1"));
packageParams.add(new BasicNameValuePair("trade_type", "APP"));
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair("sign", sign));
String xmlstring =toXml(packageParams);
return xmlstring;
} catch (Exception e) {
Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());
return null;
}
}
2.4 获取二次签名sign
private void genPayReq() {
req.appId = Constants.APP_ID;
req.partnerId = Constants.MCH_ID;
req.prepayId = resultunifiedorder.get("prepay_id");
// req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");
req.packageValue = "Sign=WXPay";
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
/**
* 这里的package参数值必须是Sign=WXPay,否则IOS端调不起微信支付,
* (参数值是"prepay_id="+resultunifiedorder.get("prepay_id")的时候Android可以,IOS不可以)
*/
signParams.add(new BasicNameValuePair("package", req.packageValue));
/**注意二次签名这里不再是mch_id,变成了prepayid;*/
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genAppSign(signParams);
sb.append("sign\n"+req.sign+"\n\n");
show.setText(sb.toString());
Log.e("orion", signParams.toString());
}
2.5 起调微信支付
private void sendPayReq() {
msgApi.registerApp(Constants.APP_ID);
msgApi.sendReq(req);
}
2.6 配置Manifest.xml,权限什么的按照文档的配置就行了
<activity
android:name=".PayActivity"
android:label="@string/app_name"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--这个intent-filter不要忘了-->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="wxd930ea5d5a258f4f"/>
</intent-filter>
</activity>
三、补充
5,支付通知接口和退款接口按照开发文档即可,这里不再赘述
6, 在你的项目测试微信支付的时候,一定要用你自己的keystore签名出来测试,如果用debug.keystore肯定是不成功的,切记,切记,不要闹乌龙!!!
Android App支付系列(一):微信支付接入详细指南(附官方支付demo)
写在前面
一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一。梳理了下微信支付的接入,今天给大家分享下腾讯旗下的微信支付SDK的接入流程。
接入流程
1.申请开发者资质
地址:https://open.weixin.qq.com/
使用公司管理者/高层帐号登录微信开放平台,进入“账号中心”,进行开发者资质认证,需要填写公司资料,包括但不限于,公司注册号,公司营业执照,公司对外办公电话,公司对公银行卡信息(卡号,发卡行)。审核时间为一周左右。
备注:因为从2015年10月1日起,国家实行三证(组织机构代码证,企业营业执照,税务登记证)合一,所以组织机构代码处填写-工商执照注册号,同样,组织机构代码证,上传-企业工商营业执照。
备注2:进行开发者资质认证需要支付300元人名币/年,只有具备开发者资质认证的开发者才能够使用app支付,授权登录等接口。
2.申请APP_ID/APP_KEY
每个应用/游戏要调用微信的接口都需要有一个微信标志,这个唯一标志通常成为APP_ID或者APP_KEY,各开放平台差异不大
进入管理中心,创建移动应用,每个开发者具有10个应用的创建机会,好在创建的应用可以随时删除。已上线的应用就不建议手贱删除!!
申请appid需要填写应用信息:应用名称,包名,签名(keystore的md5值去分号小写),icon(28*28 & 108*108),app下载地址等信息,即可分配到一个appid。
备注:测试支付时,务必使用申请时填写的keystore文件签名,包名也需要核对清楚,必然无法调起支付,返回-1错误码。
3.申请支付能力
在管理中心,查看需要集成支付能力的app,找到“微信支付”一栏,点击右侧“申请开通”,填写一些企业信息后等待审核,审核时间为一周左右,审核通过后,会得到一个企业商户号及密码,对公银行卡中将收到几分钱,进入商户平台,输入收到的金钱金额以验证。验证通过后即可开始集成支付调用。在这之前,调用支付接口是无法完成支付的。
4.代码集成微信支付
支付流程图
微信支付流程图白话版:
1.客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:
params.put("appid",appID);// 微信appid,选择性上传,服务器写死亦可 params.put("money",money);// 支付金额,单位:分 params.put("name",goodsName);// 商品名称 params.put("currencytype","CNY");// 支付币种,只能填CNY,代表人民币
备注:以上是参数字段是我们公司服务器定义,给服务器用以获取预支付订单号prePayId用。
备注2:详细字段请参考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
2.app服务器调用微信“统一下单”接口,得到prePayId订单号并返回prePayId给手机客户端;
3.手机客户端使用prePayId及商品信息调起微信客户端进行支付;
3.1用户操作:输入密码进行支付;返回键取消支付;网络无连接支付失败等;
4.微信客户端回调支付结果给咱们的APP客户端;
5.微信服务器异步通知咱们公司app服务器支付结果(服务器的工作,与客户端无关)
微信支付代码:
IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext,WX_APPID,true); mWxApi.registerapp(WX_APPID); /** * 请求app服务器得到的回调结果 */ @Override public void onGet(JSONObject jsonObject) { if (mWxApi != null) { PayReq req = new PayReq(); req.appId = WX_APPID;// 微信开放平台审核通过的应用APPID try { req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商户号 req.prepayId = jsonObject.getString("prepayid");// 预支付订单号,app服务器调用“统一下单”接口获取 req.nonceStr = jsonObject.getString("noncestr");// 随机字符串,不长于32位,服务器小哥会给咱生成 req.timeStamp = jsonObject.getString("timestamp");// 时间戳,app服务器小哥给出 req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 req.sign = jsonObject.getString("sign");// 签名,服务器小哥给出,他会根据:https://pay.weixin.qq.com/wiki/doc/api/app/app.PHP?chapter=4_3指导得到这个 } catch (JSONException e) { e.printstacktrace(); } mWxApi.sendReq(req); Log.d("发起微信支付申请"); } }
在app包下新建wxapi包,比如app包名为com.xiongit.app,那个新建的包路径为com.xiongit.app.wxapi,该包下新建WXPayEntryActivity,继承自任意Activity。该Activity用以接收支付结果回调,清单声明此Activity的格式为
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singletop"/>
WXPayEntryActivity代码示例
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{ private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity"; private IWXAPI api; private static final String APP_ID = "your app id"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this,APP_ID); api.handleIntent(getIntent(),this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent,this); } @Override public void onReq(BaseReq req) { } /** * 得到支付结果回调 */ @Override public void onResp(BaseResp resp) { Log.d(TAG,"onPayFinish,errCode = " + resp.errCode);// 支付结果码 } }
回调中errCode值列表:
0 支付成功
-1 发生错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 发生场景:用户不支付了,点击取消,返回APP。
清单menifest申明所需权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MODIFY_AUdio_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
备注:支付结果最终以app服务器的得到的异步通知为准。
微信SDK混淆
-keep class com.tencent.mm.sdk.** { *; }
update 20160704
当支付时,微信尚未登录,得不到任何回调,如果调起支付时有弹窗进度框,并且你想在得到响应码后让它消失是行不通的,需要在跳出的onStop中处理进度条,不然未登录并且用户取消了支付时进度条无法消失。
update 20160722
当支付时,WXPayEntryActivity会以透明的形式启动,所以你可能需要在支付完成得到支付响应码后手动finish该activity,不然你自己写的支付页面的activity需要返回两次才能退出,因为第一次按下back键实际是finish掉WXPayEntryActivity.第二次才是你自己的activity.
完事了,祝各位集成微信支付成功!
最后附上微信官方支付demo下载:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,吐槽语:官方demo下载藏的有点深。。。开放平台居然没有提供下载,放在微信支付商户平台。
今天关于android微信支付源码分享和asp微信支付源码的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android 11 无法调起微信支付解决方案、Android app 第三方微信支付接入详解、Android APP接入微信支付、Android App支付系列(一):微信支付接入详细指南(附官方支付demo)的相关知识,请在本站搜索。
本文标签: