请问圣地亚哥商场能用weixin支付吗或者zhifubao.com

Android 集成微信支付和支付宝
最近比较闲,公司项目更换后台,于是自己来研究微信支付和支付宝支付,把自己学习的过程写下来,以备以后查看。
注:要集成微信支付和支付宝功能,必须要有以下几个配置信息,而这写信息需要公司去微信支付和支付宝开放平台申请并提供给开发者,当然自己也可以去申请,这里作者用的是公司提供的,这里不纠结这些过程。获得这些信息以后
将配置信息放到一个静态类中,以共统一使用,但是处于安全考虑,微信与支付宝推荐这些数据放到服务器,这里作者把他们都放在前端,整个过程都是前端处理,实际开发尽量预处理订单生成放到后端处理。
public class ParameterConfig {
public static final String
GANHOST = &http://101.226.197.11&; //服务器地址ip(根据自己替换)
public static final String WX_APP_ID = &&;// 自己填写自己项目的
public static final String WX_MCH_ID = &&;// 自己填写自己项目的
// API密钥,在商户平台设置
public static final String WX_API_KEY = &&;// 自己填写自己项目的
//服务器回调接口
public static final String WX_notifyUrl = GANHOST+&/service/orderComplete&;// 用于微信支付成功的回调(按自己需求填写)
// 商户PID
public static final String PARTNER = &&;//自己填写自己项目的
// 商户收款账号
public static final String SELLER = &&;//自己填写自己项目的
// 商户私钥,pkcs8格式
public static final String RSA_PRIVATE = &&;//自己填写自己项目的
public static final String aliPay_notifyURL = GANHOST+&/service/alipay/orderComplete&;//支付宝支付成功的回调
1.微信支付的集成前提条件
1.首先需要导入微信jar包,从开放平台可以下载到,加入到libs目录即可
2.配置manifest
a.用户权限
&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&& &/uses-permission&&/uses-permission&&/uses-permission&
b.activity配置,这里com.gan.mypay改成自己的包名(如果自己包名与src下的package 名不一样,这里要的是在manifest中配置的名称,同样需要在src建立以自己包 名为路劲的package,一定确保有这个activity)这个activity是微信支付结果要回调的activty
<activity android:name=&com.gan.mypay.wxapi.WXPayEntryActivity&
android:exported=&true&
android:launchMode=&singleTop&/&</activity
2.支付宝支付的集成前提条件
1.首先需要导入微信jar包,从开放平台可以下载到,加入到libs目录即可
2.配置manifest
a.用户权限
&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&&&/uses-permission&&/uses-permission&&/uses-permission&
b.activity配置这里必须要这么配置
<activity android:name=&com.alipay.sdk.app.H5PayActivity&
android:configChanges=&orientation|keyboardHidden|navigation&
android:exported=&false&
android:screenOrientation=&behind& &
<activity android:name=&com.alipay.sdk.auth.AuthActivity&
android:configChanges=&orientation|keyboardHidden|navigation&
android:exported=&false&
android:screenOrientation=&behind& &
</activity</activity
3.代码集成
1.首先要有个商品页面MainActivity,用来手机收集商品信息,这里需要后台交互生成订单,我偷懒就直接在页面生成了假订单
MainActivity.java(这里用了xutils的注入)
@ContentView(R.layout.activity_main)
public class MainActivity extends Activity {
@ViewInject(R.id.product_ordsubmit_username)
private TextView usernameTV;
@ViewInject(R.id.product_ordsubmit_phone)
private TextView phoneTV;
@ViewInject(R.id.product_ordsubmit_adress)
private TextView adressTV;
@ViewInject(R.id.product_ordsubmit_desc)
private TextView descTV;
@ViewInject(R.id.product_ordsubmit_price)
private TextView priceTV;
@ViewInject(R.id.product_ordsubmit_intg)
private TextView intgTV;
@ViewInject(R.id.product_ordsubmit_count1)
private TextView countTV1;
@ViewInject(R.id.product_ordsubmit_count)
private TextView countTV;
@ViewInject(R.id.product_ordsubmit_intgtotal1)
private TextView intgtotal1TV;
@ViewInject(R.id.product_ordsubmit_intgtotal2)
private TextView intgtotal2TV;
@ViewInject(R.id.product_ordsubmit_pricetotal1)
private TextView pricetotal1TV;
@ViewInject(R.id.product_ordsubmit_pricetotal2)
private TextView pricetotal2TV;
@ViewInject(R.id.product_ordsubmit_counttotal)
private TextView counttotalTV;
@ViewInject(R.id.product_ordsubmit_ok)
private Button okB
@ViewInject(R.id.product_ordsubmit_say_et)
private TextView sayEt;
@ViewInject(R.id.product_ordsubmit_img)
private ImageV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewUtils.inject(this);
goods = new Goods();
goods.costprice=100;
goods.productid=;
goods.producttypeid=11;
goods.productname=&测试商品&;
goods.discountprice=0.01;
goods.productdescription=&商品描述&;
panydesc=&测试商户简单描述&;
anyadress=&商户地址未知&;
panyname=&测试商户&;
goods.score=1;
goods.status=1;
goods.stock=300;
initData();
initView();
private void initData() {
username =&客户名称&;
mobile = &&;
adress=&客户地址&;
private void initView() {
usernameTV.setText(&收货人:&+username);
phoneTV.setText(mobile+&&);
adressTV.setText(adress);
descTV.setText(goods.productdescription);
priceTV.setText(&¥&+goods.discountprice);
intgTV.setText(&积分:&+goods.score);
countTV1.setText(&X&+count);
countTV.setText(count+&&);
intgtotal1TV.setText(&共得到&+count*goods.score+&积分&);
intgtotal2TV.setText(&积分:&+count*goods.score);
counttotalTV.setText(&共&+count+&件&);
pricetotal1TV.setText(&¥&+Arith.mul(goods.discountprice, count));
pricetotal2TV.setText(&¥&+Arith.mul(goods.discountprice, count));
//ImageLoader.getInstance().displayImage(goods.pic1, img);
* 增加数量
* @param v
@OnClick(R.id.product_ordsubmit_count_add)
public void add(View v) {
countTV1.setText(&X&+count);
countTV.setText(count+&&);
intgtotal1TV.setText(&共得到&+count*goods.score+&积分&);
intgtotal2TV.setText(&积分:&+count*goods.score);
counttotalTV.setText(&共&+count+&件&);
pricetotal1TV.setText(&¥&+Arith.mul(goods.discountprice, count));
pricetotal2TV.setText(&¥&+Arith.mul(goods.discountprice, count));
* 减少数量
* @param v
@OnClick(R.id.product_ordsubmit_count_sub)
public void sub(View v) {
if (count&1) {
countTV1.setText(&X&+count);
countTV.setText(count+&&);
intgtotal1TV.setText(&共得到&+count*goods.score+&积分&);
intgtotal2TV.setText(&积分:&+count*goods.score);
counttotalTV.setText(&共&+count+&件&);
pricetotal1TV.setText(&¥&+Arith.mul(goods.discountprice, count));
pricetotal2TV.setText(&¥&+Arith.mul(goods.discountprice, count));
* 提交订单
* @param v
@OnClick(R.id.product_ordsubmit_ok)
public void submit(View v) {
final OrderInfo orderInfo=new OrderInfo();
orderInfo.userid=13752;
orderInfo.areacode=23;
orderInfo.buildno=&10&;
orderInfo.roomno=&1001&;
orderInfo.producttypeid=goods.
orderInfo.productid=goods.
orderInfo.amount=goods.//单价
orderInfo.account=//数量
orderInfo.totalamount=Arith.mul(goods.discountprice, count);
////抵扣金额
orderInfo.score=count*goods.
////评价项
////评价级别
//S//评价内容
//long payid=;//支付编号
orderInfo.status=2;//支付状态待付款
orderInfo.type=11;//日用品
orderInfo.usermemo =sayEt.getText().toString();//业主备注
orderInfo.address =
orderInfo.productname =goods.//
orderInfo.desccontext =goods.//
orderInfo.outtradeno=System.currentTimeMillis()+&&+orderInfo.
orderInfo.
submitorder(orderInfo);
* 订单提交成功,进入付款界面
* @param orderInfo
private void submitorder(OrderInfo orderInfo) {
Intent intent=new Intent(this, SelectPayTypeActivity.class);
intent.putExtra(&data&, orderInfo);
startActivity(intent);
activty_main.xml
2.在mainactivty中点击确认按钮调用支付方式选择页面SelectPayTypeActivity,用来发起支付选择
vcq9" height="800" src="/uploadfile/Collfiles/87.png" width="480" />
SelectPayTypeActivity.java
@ContentView(R.layout.activity_select_pay_type) public class SelectPayTypeActivity extends Activity { @ViewInject(R.id.paytype_of_weixin_ck) private CheckBox weixinCK; @ViewInject(R.id.paytype_of_zhifubao_ck) private CheckBox zhifubaoCK; @ViewInject(R.id.last_pay_count_tv) private TextView payCountTv; private OrderInfo orderI @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewUtils.inject(this); initData(); initView(); } private void initView() { payCountTv.setText(&¥&+orderInfo.totalamount); } private void initData() { orderInfo=(OrderInfo) getIntent().getSerializableExtra(&data&); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); int code=intent.getIntExtra(&result&, 1); switch (code) { case 0://表示成功 finish(); case -1://表示失败 finish(); case -2:////表示取消 finish(); case 1://未知不做处理 default: } } @OnClick(R.id.paytype_of_weixin) public void wx(View v) { if (zhifubaoCK.isChecked()) { zhifubaoCK.setChecked(false); } if (!weixinCK.isChecked()) { weixinCK.setChecked(true); } } @OnClick(R.id.paytype_of_zhifubao) public void zfb(View v) { if (weixinCK.isChecked()) { weixinCK.setChecked(false); } if (!zhifubaoCK.isChecked()) { zhifubaoCK.setChecked(true); } } @OnClick(R.id.paytype_of_weixin_ck) public void wxck(View v) { if (zhifubaoCK.isChecked()) { zhifubaoCK.setChecked(false); } if (!weixinCK.isChecked()) { weixinCK.setChecked(true); } } @OnClick(R.id.paytype_of_zhifubao_ck) public void zfbck(View v) { if (weixinCK.isChecked()) { weixinCK.setChecked(false); } if (!zhifubaoCK.isChecked()) { zhifubaoCK.setChecked(true); } } @OnClick(R.id.btn_pay_submit) public void paysubmit(View v) { if (weixinCK.isChecked()) { if (!isWeixinAvilible(this)) { Toast.makeText(this, &请先安装微信或者选择其他支付方式&,0).show(); } //微信支付 payByWX(handler,orderInfo); }else{ if (!isZfbAvilible(this)) { Toast.makeText(this, &请先安支付宝或者选择其他支付方式&,0).show(); } //支付宝支付 payByzfb(handler,orderInfo); } } Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case 9000://支付宝支付成功 I finish(); case 8000://支付宝支付失败 finish(); default: } } }; /** * 调用支付宝支付 * @param handler * @param order */ private void payByzfb(Handler handler, OrderInfo order) { AlipayUtil alipay=new AlipayUtil(this,order,handler); } /** * 调用微信支付 * @param handler * @param orderInfo2 */ private void payByWX(Handler handler, OrderInfo order) { WXpayUtil wxpay=new WXpayUtil(this,order); } /** * 检查微信是否存在 * @param context * @return */ public boolean isWeixinAvilible(Context context) { PackageManager packageManager = context.getPackageManager();// 获取packagemanager List pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息 if (pinfo != null) { for (int i = 0; i & pinfo.size(); i++) { String pn = pinfo.get(i).packageN System.out.println(pinfo.get(i).packageName); if (pn.equals(&com.tencent.mm&)) { } } } } /** * 检查支付包是否存在 * @param context * @return */ private boolean isZfbAvilible(Context context) { PackageManager packageManager = context.getPackageManager();// 获取packagemanager List pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息 if (pinfo != null) { for (int i = 0; i & pinfo.size(); i++) { String pn = pinfo.get(i).packageN System.out.println(pinfo.get(i).packageName); if (pn.equals(&com.alipay.android.app&)) { } } } } }
activty_selecte_pay_type.xml
3.根据支付方式调用对应工具类微信(WXpayUtil),支付宝(AlipayUtil)
WXpayUtil.java
public class WXpayUtil {
private IWXAPI
private OrderI
private PayR
private Map
private static final String TAG = &ewuye.online.SelectPayTypeActivity&;
public WXpayUtil(Context mcontext,OrderInfo order){
//初始化微信支付
this.order=
this.context=
if (TextUtils.isEmpty(ParameterConfig.WX_APP_ID) || TextUtils.isEmpty(ParameterConfig.WX_MCH_ID) || TextUtils.isEmpty(ParameterConfig.WX_API_KEY)) {
new AlertDialog.Builder(context).setTitle(&警告&).setMessage(&需要配置WX_APP_ID | WX_MCH_ID| WX_API_KEY\n请到ParameterConfig.java里配置&)
.setPositiveButton(&确定&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
((Activity)context).finish();
}).show();
api = WXAPIFactory.createWXAPI(context, null);
req = new PayReq();
//生成prepay_id
GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
getPrepayId.execute();
* 用于获取
* @author 95
private class GetPrepayIdTask extends AsyncTask& {
private ProgressD
protected void onPreExecute() {
dialog = ProgressDialog.show(context, &提示&, &正在获取预支付订单...&);
protected void onPostExecute(Map result) {
if (dialog != null) {
dialog.dismiss();
resultunifiedorder=
genPayReq();
protected void onCancelled() {
super.onCancelled();
protected Map
doInBackground(Void... params) {
String url = String.format(&https://api.mch./pay/unifiedorder&);
String entity = genProductArgs();
Log.e(&orion&,entity);
byte[] buf = httpPost(url, entity);
String content = new String(buf);
Log.e(&orion&, content);
Map xml=decodeXml(content);
private void genPayReq() {
req.appId = ParameterConfig.WX_APP_ID;
req.partnerId = ParameterConfig.WX_MCH_ID;
req.prepayId = resultunifiedorder.get(&prepay_id&);
req.packageValue = &prepay_id=&+resultunifiedorder.get(&prepay_id&);
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
List signParams = new LinkedList();
signParams.add(new BasicNameValuePair(&appid&, req.appId));
signParams.add(new BasicNameValuePair(&noncestr&, req.nonceStr));
signParams.add(new BasicNameValuePair(&package&, req.packageValue));
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);
Log.e(&orion&, signParams.toString());
sendPayReq();
private void sendPayReq() {
api.registerApp(ParameterConfig.WX_APP_ID);
api.sendReq(req);
private String genProductArgs() {
StringBuffer xml = new StringBuffer();
String nonceStr = genNonceStr();
xml.append(&&);
List packageParams = new LinkedList();
packageParams.add(new BasicNameValuePair(&appid&, ParameterConfig.WX_APP_ID));
packageParams.add(new BasicNameValuePair(&body&, order.productname));
packageParams.add(new BasicNameValuePair(&mch_id&, ParameterConfig.WX_MCH_ID));
packageParams.add(new BasicNameValuePair(&nonce_str&, nonceStr));
packageParams.add(new BasicNameValuePair(&notify_url&, ParameterConfig.WX_notifyUrl));
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&, (int)(order.totalamount*100)+&&));
packageParams.add(new BasicNameValuePair(&trade_type&, &APP&));
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair(&sign&, sign));
String xmlstring =toXml(packageParams);
return new String(xmlstring.toString().getBytes(), &ISO8859-1&);
} catch (Exception e) {
Log.e(TAG, &genProductArgs fail, ex = & + e.getMessage());
private String genAppSign(List params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i & params.size(); i++) {
sb.append(params.get(i).getName());
sb.append(&#39;=&#39;);
sb.append(params.get(i).getValue());
sb.append(&#39;&&#39;);
sb.append(&key=&);
sb.append(ParameterConfig.WX_API_KEY);
String appSign = getMessageDigest(sb.toString().getBytes());
Log.e(&orion&,appSign);
return appS
HttpClient getNewHttpClient() {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme(&http&, PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme(&https&, sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
private class SSLSocketFactoryEx extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance(&TLS&);
public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
public void checkServerTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
sslContext.init(null, new TrustManager[] { tm }, null);
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
byte[] httpPost(String url, String entity) {
if (url == null || url.length() == 0) {
Log.e(TAG, &httpPost, url is null&);
HttpClient httpClient = getNewHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new StringEntity(entity));
httpPost.setHeader(&Accept&, &application/json&);
httpPost.setHeader(&Content-type&, &application/json&);
HttpResponse resp = httpClient.execute(httpPost);
if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
Log.e(TAG, &httpGet fail, status code = & + resp.getStatusLine().getStatusCode());
return EntityUtils.toByteArray(resp.getEntity());
} catch (Exception e) {
Log.e(TAG, &httpPost exception, e = & + e.getMessage());
e.printStackTrace();
private String genOutTradNo() {
Random random = new Random();
return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
public Map decodeXml(String content) {
Map xml = new HashMap();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(content));
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String nodeName=parser.getName();
switch (event) {
case XmlPullParser.START_DOCUMENT:
case XmlPullParser.START_TAG:
if(&xml&.equals(nodeName)==false){
//实例化student对象
xml.put(nodeName,parser.nextText());
case XmlPullParser.END_TAG:
event = parser.next();
} catch (Exception e) {
Log.e(&orion&,e.toString());
private String genNonceStr() {
Random random = new Random();
return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
private long genTimeStamp() {
return System.currentTimeMillis() / 1000;
String getMessageDigest(byte[] buffer) {
char hexDigits[] = { &#39;0&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;, &#39;f&#39; };
MessageDigest mdTemp = MessageDigest.getInstance(&MD5&);
mdTemp.update(buffer);
byte[] md = mdTemp.digest();
int j = md.
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i & i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 &&& 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
return new String(str);
} catch (Exception e) {
private String genPackageSign(List params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i & params.size(); i++) {
sb.append(params.get(i).getName());
sb.append(&#39;=&#39;);
sb.append(params.get(i).getValue());
sb.append(&#39;&&#39;);
sb.append(&key=&);
sb.append(ParameterConfig.WX_API_KEY);
String packageSign = getMessageDigest(sb.toString().getBytes()).toUpperCase();
Log.e(&orion&,packageSign);
return packageS
private String toXml(List params) {
StringBuilder sb = new StringBuilder();
sb.append(&&);
for (int i = 0; i & params.size(); i++) {
sb.append(&&&+params.get(i).getName()+&&&);
sb.append(params.get(i).getValue());
sb.append(&&);
sb.append(&&);
Log.e(&orion&,sb.toString());
return sb.toString();
AlipayUtil.java
public class AlipayUtil {
private OrderI
private static final int SDK_PAY_FLAG = 1;
public AlipayUtil(Activity context, OrderInfo order,Handler mhandler) {
this.context=
this.order=
this.mhandler=
private void pay() {
//判断是否注册商户到支付宝
if (TextUtils.isEmpty(ParameterConfig.PARTNER) || TextUtils.isEmpty(ParameterConfig.RSA_PRIVATE) || TextUtils.isEmpty(ParameterConfig.SELLER)) {
new AlertDialog.Builder(context).setTitle(&警告&).setMessage(&需要配置PARTNER | RSA_PRIVATE| SELLER\n请到ParameterConfig.java里配置&)
.setPositiveButton(&确定&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
((Activity)context).finish();
}).show();
String orderInfo = getOrderInfo(order);
* 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
String sign = sign(orderInfo);
* 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, &UTF-8&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
* 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + &&sign=\&& + sign + &\&&& + getSignType();
Runnable payRunnable = new Runnable() {
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(context);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
mHandler.sendMessage(msg);
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
@SuppressLint(&HandlerLeak&)
private Handler mHandler = new Handler() {
@SuppressWarnings(&unused&)
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc./doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建议商户依赖异步通知
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为&9000&则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, &9000&)) {
mhandler.sendEmptyMessage(9000);
//Toast.makeText(context, &支付成功&, Toast.LENGTH_SHORT).show();
// 判断resultStatus 为非&9000&则代表可能支付失败
// &8000&代表支付结果因为支付渠道原因或者原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, &8000&)) {
Toast.makeText(context, &支付结果确认中&, Toast.LENGTH_SHORT).show();
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(context, &支付宝支付失败&, Toast.LENGTH_SHORT).show();
mhandler.sendEmptyMessage(8000);
* create the order info. 创建订单信息
private String getOrderInfo(OrderInfo order) {
// 签约合作者身份ID
String orderInfo = &partner=& + &\&& + ParameterConfig.PARTNER + &\&&;
// 签约卖家支付宝账号
orderInfo += &&seller_id=& + &\&& +ParameterConfig.SELLER + &\&&;
// 商户网站唯一订单号
orderInfo += &&out_trade_no=& + &\&& + order.outtradeno + &\&&;
// 商品名称
orderInfo += &&subject=& + &\&& + order.productname + &\&&;
// 商品详情
orderInfo += &&body=& + &\&& + order.desccontext + &\&&;
// 商品金额
orderInfo += &&total_fee=& + &\&& +
order.totalamount + &\&&;
// 服务器异步通知页面路径
orderInfo += &&ify_url=& + &\&& + ParameterConfig.aliPay_notifyURL + &\&&;
// 服务接口名称, 固定值
orderInfo += &&service=\&mobile.securitypay.pay\&&;
// 支付类型, 固定值
orderInfo += &&payment_type=\&1\&&;
// 参数编码, 固定值
orderInfo += &&_input_charset=\&utf-8\&&;
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += &&it_b_pay=\&30m\&&;
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += &&extern_token=& + &\&& + extern_token + &\&&;
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += &&return_url=\&\&&;
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += &&paymethod=\&expressGateway\&&;
return orderI
* sign the order info. 对订单信息进行签名
* @param content
待签名订单信息
private String sign(String content) {
return SignUtils.sign(content, ParameterConfig.RSA_PRIVATE);
* get the sign type we use. 获取签名方式
private String getSignType() {
return &sign_type=\&RSA\&&;
微信的回调actvity
WXPayEntryActivity.java
package com.gan.mypay.
import com.gan.mypay.ParameterC
import com.gan.mypay.R;
import com.gan.mypay.SelectPayTypeA
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseR
import com.tencent.mm.sdk.modelbase.BaseR
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventH
import com.tencent.mm.sdk.openapi.WXAPIF
import android.app.A
import android.app.AlertD
import android.content.I
import android.os.B
import android.util.L
import android.widget.T
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = &MicroMsg.SDKSample.WXPayEntryActivity&;
private IWXAPI
// private TextV
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wx_pay_result);
api = WXAPIFactory.createWXAPI(this, ParameterConfig.WX_APP_ID);
api.handleIntent(getIntent(), this);
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
public void onReq(BaseReq req) {
public void onResp(BaseResp resp) {
Log.d(TAG, &onPayFinish, errCode = & + resp.errCode);
if (resp.getType() == MAND_PAY_BY_WX) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(&提示&);
//builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
builder.show();
int code = resp.errC
switch (code) {
Toast.makeText(this, &支付成功&,0).show();
intent=new Intent(this,SelectPayTypeActivity.class);
intent.putExtra(&result&, 0);
startActivity(intent);
Toast.makeText(this, &支付失败&,0).show();
intent=new Intent(this,SelectPayTypeActivity.class);
intent.putExtra(&result&, -1);
startActivity(intent);
Toast.makeText(this, &支付取消&,0).show();
intent=new Intent(this,SelectPayTypeActivity.class);
intent.putExtra(&result&, -2);
startActivity(intent);}

我要回帖

更多关于 weixin4j 支付 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信